diff options
author | Felix Fietkau <nbd@openwrt.org> | 2012-02-12 18:40:18 +0000 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2012-02-12 18:40:18 +0000 |
commit | 9f551028d2568f774e4738ee584d438adf327615 (patch) | |
tree | f51642ac504fe2ccf572b95dfc4932f3e28a6816 | |
parent | 22ec8b4839f3a4cffdce1d476f1911dc8463f495 (diff) | |
download | upstream-9f551028d2568f774e4738ee584d438adf327615.tar.gz upstream-9f551028d2568f774e4738ee584d438adf327615.tar.bz2 upstream-9f551028d2568f774e4738ee584d438adf327615.zip |
package/grub: fix stage2 link with recent binutils
We want the `_start's symbols to be at the very beginning of the `stage2'
binary's `.text' section. However, nothing enforces this requirement. With
recent binutils (ie. post 2.19.1), this results in a corrupt binary, as ld(1)
puts another symbol (eg. `journal_init') at the beginning of the section.
Fix this by providing a stripped down version of the default linker script
where we enforces the position of `_start' in the `.text' section.
Patch by Arnaud Lacombe (#10444)
SVN-Revision: 30484
-rw-r--r-- | package/grub/patches/030-add-stage2-ldscripts.patch | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/package/grub/patches/030-add-stage2-ldscripts.patch b/package/grub/patches/030-add-stage2-ldscripts.patch new file mode 100644 index 0000000000..aff7ed466f --- /dev/null +++ b/package/grub/patches/030-add-stage2-ldscripts.patch @@ -0,0 +1,77 @@ +From 8858927ddc6797489cad322fc2d2134aeae543cd Mon Sep 17 00:00:00 2001 +From: Arnaud Lacombe <lacombar@gmail.com> +Date: Sun, 11 Dec 2011 16:44:02 -0500 +Subject: [PATCH] add-stage2-ldscripts + +--- + stage2/Makefile.am | 2 +- + stage2/Makefile.in | 2 +- + stage2/stage2.ldscripts | 30 ++++++++++++++++++++++++++++++ + 3 files changed, 32 insertions(+), 2 deletions(-) + create mode 100644 stage2/stage2.ldscripts + +diff --git a/stage2/Makefile.am b/stage2/Makefile.am +index f8e6d42..ea28a4d 100644 +--- a/stage2/Makefile.am ++++ b/stage2/Makefile.am +@@ -55,7 +55,7 @@ noinst_PROGRAMS = pre_stage2.exec start.exec start_eltorito.exec \ + endif + MOSTLYCLEANFILES = $(noinst_PROGRAMS) + +-PRE_STAGE2_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8200 ++PRE_STAGE2_LINK = -nostdlib -Wl,-N -Wl,-Tstage2.ldscripts + START_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8000 + NBLOADER_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,0 + PXELOADER_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00 +diff --git a/stage2/Makefile.in b/stage2/Makefile.in +index d0062bd..7bee2d5 100644 +--- a/stage2/Makefile.in ++++ b/stage2/Makefile.in +@@ -468,7 +468,7 @@ libgrub_a_CFLAGS = $(GRUB_CFLAGS) -I$(top_srcdir)/lib \ + @DISKLESS_SUPPORT_FALSE@noinst_DATA = pre_stage2 start start_eltorito + @DISKLESS_SUPPORT_TRUE@noinst_DATA = pre_stage2 start start_eltorito nbloader pxeloader diskless + MOSTLYCLEANFILES = $(noinst_PROGRAMS) +-PRE_STAGE2_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8200 ++PRE_STAGE2_LINK = -nostdlib -Wl,-N -Wl,-Tstage2.ldscripts + START_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8000 + NBLOADER_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,0 + PXELOADER_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00 +diff --git a/stage2/stage2.ldscripts b/stage2/stage2.ldscripts +new file mode 100644 +index 0000000..2c8b8e1 +--- /dev/null ++++ b/stage2/stage2.ldscripts +@@ -0,0 +1,30 @@ ++/* Script for -N: mix text and data on same page; don't align data */ ++OUTPUT_FORMAT("elf32-i386", "elf32-i386", ++ "elf32-i386") ++OUTPUT_ARCH(i386) ++ENTRY(_start) ++SECTIONS ++{ ++ . = 0x8200; ++ .text : ++ { ++ _start = .; ++ *(.text .text.* ) ++ } ++ .rodata : { *(.rodata .rodata.* ) } ++ /* Adjust the address for the data segment. We want to adjust up to ++ the same address within the page on the next page up. */ ++ . = .; ++ .data : { *(.data .data.* ) } ++ __bss_start = .; ++ .bss : ++ { ++ *(.bss .bss.* ) ++ *(COMMON) ++ . = ALIGN(. != 0 ? 32 / 8 : 1); ++ } ++ . = ALIGN(32 / 8); ++ . = ALIGN(32 / 8); ++ _end = .; PROVIDE (end = .); ++ .comment 0 : { *(.comment) } ++} +-- +1.7.6.153.g78432 + |