diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2020-11-13 15:44:35 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2020-11-13 15:44:47 -0800 |
commit | cbd5b99cce073273f668b154d4514e8e7e7ccc51 (patch) | |
tree | ed448b47d23eaaa211ed2e56fde87c3f8be6a011 | |
parent | 25f4c26276594b0afdb7709df668a90858e399fa (diff) | |
download | binutils-cbd5b99cce073273f668b154d4514e8e7e7ccc51.zip binutils-cbd5b99cce073273f668b154d4514e8e7e7ccc51.tar.gz binutils-cbd5b99cce073273f668b154d4514e8e7e7ccc51.tar.bz2 |
elf: Set rel_from_abs to 1 for __ehdr_start
bfdlink.h has
/* Symbol will be converted from absolute to section-relative. Set for
symbols defined by a script from "dot" (also SEGMENT_START or ORIGIN)
outside of an output section statement. */
unsigned int rel_from_abs : 1;
linker.c has
.{* Return TRUE if the symbol described by a linker hash entry H
. is going to be absolute. Linker-script defined symbols can be
. converted from absolute to section-relative ones late in the
. link. Use this macro to correctly determine whether the symbol
. will actually end up absolute in output. *}
.#define bfd_is_abs_symbol(H) \
. (((H)->type == bfd_link_hash_defined \
. || (H)->type == bfd_link_hash_defweak) \
. && bfd_is_abs_section ((H)->u.def.section) \
. && !(H)->rel_from_abs)
.
Set rel_from_abs to 1 for __ehdr_start which will be converted from
absolute to section-relative in assign_file_positions_for_load_sections.
PR ld/26869
* ldelf.c (ldelf_before_allocation): Set rel_from_abs to 1 for
__ehdr_start.
* testsuite/ld-i386/i386.exp: Run pr26869.
* testsuite/ld-i386/pr26869.d: New file.
* testsuite/ld-i386/pr26869.s: Likewise.
-rw-r--r-- | ld/ChangeLog | 9 | ||||
-rw-r--r-- | ld/ldelf.c | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-i386/i386.exp | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-i386/pr26869.d | 14 | ||||
-rw-r--r-- | ld/testsuite/ld-i386/pr26869.s | 3 |
5 files changed, 29 insertions, 0 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index d5d37b1..70ea14b 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,12 @@ +2020-11-13 H.J. Lu <hongjiu.lu@intel.com> + + PR ld/26869 + * ldelf.c (ldelf_before_allocation): Set rel_from_abs to 1 for + __ehdr_start. + * testsuite/ld-i386/i386.exp: Run pr26869. + * testsuite/ld-i386/pr26869.d: New file. + * testsuite/ld-i386/pr26869.s: Likewise. + 2020-11-09 Andreas Schwab <schwab@linux-m68k.org> * Makefile.am (development.exp): Fix regexp. @@ -1590,6 +1590,8 @@ ldelf_before_allocation (char *audit, char *depaudit, (char *) &ehdr_start->u + sizeof ehdr_start->u.def.next, sizeof ehdr_start_save_u); ehdr_start->type = bfd_link_hash_defined; + /* It will be converted to section-relative later. */ + ehdr_start->rel_from_abs = 1; ehdr_start->u.def.section = bfd_abs_section_ptr; ehdr_start->u.def.value = 0; } diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp index 9c06f70..0620721 100644 --- a/ld/testsuite/ld-i386/i386.exp +++ b/ld/testsuite/ld-i386/i386.exp @@ -480,6 +480,7 @@ run_dump_test "property-x86-isa1" run_dump_test "property-x86-isa2" run_dump_test "property-x86-isa3" run_dump_test "property-x86-isa4" +run_dump_test "pr26869" if { !([istarget "i?86-*-linux*"] || [istarget "i?86-*-gnu*"] diff --git a/ld/testsuite/ld-i386/pr26869.d b/ld/testsuite/ld-i386/pr26869.d new file mode 100644 index 0000000..bfd00a7 --- /dev/null +++ b/ld/testsuite/ld-i386/pr26869.d @@ -0,0 +1,14 @@ +#as: --32 +#ld: -shared -melf_i386 +#readelf: -r -s --wide + +Relocation section '.rel.dyn' at offset 0x[a-f0-9]+ contains 1 entry: + Offset Info Type Sym. Value Symbol's Name +0+[a-f0-9]+ 00000008 R_386_RELATIVE + +#... +Symbol table '.symtab' contains [0-9]+ entries: + Num: Value Size Type Bind Vis Ndx Name +#... + +[a-f0-9]+: 00000000 0 NOTYPE LOCAL DEFAULT 1 __ehdr_start +#pass diff --git a/ld/testsuite/ld-i386/pr26869.s b/ld/testsuite/ld-i386/pr26869.s new file mode 100644 index 0000000..e492b98 --- /dev/null +++ b/ld/testsuite/ld-i386/pr26869.s @@ -0,0 +1,3 @@ + .text +foo: + pushl __ehdr_start@GOT(%ebx) |