From 0a27fed72d4190cc70025c671b5133e6c58d9c09 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sat, 9 Sep 2017 05:05:16 -0700 Subject: x86: Properly handle __ehdr_start After _bfd_i386_elf_convert_load and _bfd_x86_64_elf_convert_load are removed, elf_i386_convert_load_reloc and elf_x86_64_convert_load_reloc see __ehdr_start as an undefined symbol when they are called from check_relocs to convert GOT relocations against local symbols. But __ehdr_start will be defined as a hidden symbol by linker at the later stage if it is referenced. This patch marks __ehdr_start as a defined local symbol at the start of check_relocs if it is referenced and not defined. bfd/ PR ld/22115 * elf32-i386.c (elf_i386_convert_load_reloc): Check linker_def. Don't use UNDEFINED_WEAK_RESOLVED_TO_ZERO. * elf64-x86-64.c (elf_x86_64_convert_load_reloc): Check linker_def. Don't use UNDEFINED_WEAK_RESOLVED_TO_ZERO. * elfxx-x86.c (_bfd_x86_elf_link_check_relocs): Set local_ref and linker_def on __ehdr_start if it is referenced and not defined. (_bfd_x86_elf_link_symbol_references_local): Also set local_ref and return TRUE when building executable, if a symbol has non-GOT/non-PLT relocations in text section or there is no dynamic linker. * elfxx-x86.h (elf_x86_link_hash_entry): Add linker_def. ld/ PR ld/22115 * ld-i386/i386.exp: Run PR ld/22115 tests, * ld/testsuite/ld-x86-64/x86-64.exp: Likewise. * testsuite/ld-i386/pr22115-1.s: New file. * testsuite/ld-i386/pr22115-1a.d: Likewise. * testsuite/ld-i386/pr22115-1b.d: Likewise. * testsuite/ld-i386/pr22115-1c.d: Likewise. * testsuite/ld-i386/pr22115-1d.d: Likewise. * testsuite/ld-x86-64/pr22115-1.s: Likewise. * testsuite/ld-x86-64/pr22115-1a-x32.d: Likewise. * testsuite/ld-x86-64/pr22115-1a.d: Likewise. * testsuite/ld-x86-64/pr22115-1b-x32.d: Likewise. * testsuite/ld-x86-64/pr22115-1b.d: Likewise. * testsuite/ld-x86-64/pr22115-1c-x32.d: Likewise. * testsuite/ld-x86-64/pr22115-1c.d: Likewise. * testsuite/ld-x86-64/pr22115-1d-x32.d: Likewise. * testsuite/ld-x86-64/pr22115-1d.d: Likewise. --- ld/testsuite/ld-i386/i386.exp | 4 ++++ ld/testsuite/ld-i386/pr22115-1.s | 7 +++++++ ld/testsuite/ld-i386/pr22115-1a.d | 13 +++++++++++++ ld/testsuite/ld-i386/pr22115-1b.d | 6 ++++++ ld/testsuite/ld-i386/pr22115-1c.d | 13 +++++++++++++ ld/testsuite/ld-i386/pr22115-1d.d | 6 ++++++ 6 files changed, 49 insertions(+) create mode 100644 ld/testsuite/ld-i386/pr22115-1.s create mode 100644 ld/testsuite/ld-i386/pr22115-1a.d create mode 100644 ld/testsuite/ld-i386/pr22115-1b.d create mode 100644 ld/testsuite/ld-i386/pr22115-1c.d create mode 100644 ld/testsuite/ld-i386/pr22115-1d.d (limited to 'ld/testsuite/ld-i386') diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp index bd15610..f691c32 100644 --- a/ld/testsuite/ld-i386/i386.exp +++ b/ld/testsuite/ld-i386/i386.exp @@ -440,6 +440,10 @@ run_dump_test "pie1" run_dump_test "pie1-nacl" run_dump_test "pr21884" run_dump_test "pr21884-nacl" +run_dump_test "pr22115-1a" +run_dump_test "pr22115-1b" +run_dump_test "pr22115-1c" +run_dump_test "pr22115-1d" if { !([istarget "i?86-*-linux*"] || [istarget "i?86-*-gnu*"] diff --git a/ld/testsuite/ld-i386/pr22115-1.s b/ld/testsuite/ld-i386/pr22115-1.s new file mode 100644 index 0000000..341eede --- /dev/null +++ b/ld/testsuite/ld-i386/pr22115-1.s @@ -0,0 +1,7 @@ + .text + .globl _start + .type _start, @function +_start: + movl __ehdr_start@GOT(%eax), %eax + .size _start, .-_start + .weak __ehdr_start diff --git a/ld/testsuite/ld-i386/pr22115-1a.d b/ld/testsuite/ld-i386/pr22115-1a.d new file mode 100644 index 0000000..4857952 --- /dev/null +++ b/ld/testsuite/ld-i386/pr22115-1a.d @@ -0,0 +1,13 @@ +#source: pr22115-1.s +#as: --32 -mrelax-relocations=yes +#ld: -pie -z text -m elf_i386 +#objdump: -dw + +.*: +file format .* + + +Disassembly of section .text: + +[a-f0-9]+ <_start>: + +[a-f0-9]+: 8d 80 ([0-9a-f]{2} ){4} * lea -?0x[a-f0-9]+\(%eax\),%eax +#pass diff --git a/ld/testsuite/ld-i386/pr22115-1b.d b/ld/testsuite/ld-i386/pr22115-1b.d new file mode 100644 index 0000000..bb05851 --- /dev/null +++ b/ld/testsuite/ld-i386/pr22115-1b.d @@ -0,0 +1,6 @@ +#source: pr22115-1.s +#as: --32 -mrelax-relocations=yes +#ld: -pie -z text -m elf_i386 +#readelf: -r + +There are no relocations in this file. diff --git a/ld/testsuite/ld-i386/pr22115-1c.d b/ld/testsuite/ld-i386/pr22115-1c.d new file mode 100644 index 0000000..ce70539 --- /dev/null +++ b/ld/testsuite/ld-i386/pr22115-1c.d @@ -0,0 +1,13 @@ +#source: pr22115-1.s +#as: --32 -mrelax-relocations=yes +#ld: -pie -z text -m elf_i386 --no-dynamic-linker +#objdump: -dw + +.*: +file format .* + + +Disassembly of section .text: + +[a-f0-9]+ <_start>: + +[a-f0-9]+: 8d 80 ([0-9a-f]{2} ){4} * lea -?0x[a-f0-9]+\(%eax\),%eax +#pass diff --git a/ld/testsuite/ld-i386/pr22115-1d.d b/ld/testsuite/ld-i386/pr22115-1d.d new file mode 100644 index 0000000..3a0b8e3 --- /dev/null +++ b/ld/testsuite/ld-i386/pr22115-1d.d @@ -0,0 +1,6 @@ +#source: pr22115-1.s +#as: --32 -mrelax-relocations=yes +#ld: -pie -z text -m elf_i386 --no-dynamic-linker +#readelf: -r + +There are no relocations in this file. -- cgit v1.1