x86: Properly handle __ehdr_start
authorH.J. Lu <hjl.tools@gmail.com>
Sat, 9 Sep 2017 12:05:16 +0000 (05:05 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Sat, 9 Sep 2017 12:05:29 +0000 (05:05 -0700)
commit0a27fed72d4190cc70025c671b5133e6c58d9c09
tree3d9d0bc8ad47eba702a00a23ebd00c8e64da165c
parent90d499086b5d35ac5b58c925f23513f6af2c3639
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.
22 files changed:
bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf64-x86-64.c
bfd/elfxx-x86.c
bfd/elfxx-x86.h
ld/ChangeLog
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/pr22115-1.s [new file with mode: 0644]
ld/testsuite/ld-i386/pr22115-1a.d [new file with mode: 0644]
ld/testsuite/ld-i386/pr22115-1b.d [new file with mode: 0644]
ld/testsuite/ld-i386/pr22115-1c.d [new file with mode: 0644]
ld/testsuite/ld-i386/pr22115-1d.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr22115-1.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr22115-1a-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr22115-1a.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr22115-1b-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr22115-1b.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr22115-1c-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr22115-1c.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr22115-1d-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr22115-1d.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp