i386: Avoid dynamic symbol with GOT reference in PIE
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 21 Apr 2017 19:03:14 +0000 (12:03 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 21 Apr 2017 19:03:26 +0000 (12:03 -0700)
commite133d00576f3da89e7772149e8d2b6a059d26919
treeb1ac9f41d4f96706a1806d54cf45095651d0b811
parent3c5fce9bc29b216af7d10f8d6e4d8c3f11a48359
i386: Avoid dynamic symbol with GOT reference in PIE

GOT reference to global symbol in PIE will lead to dynamic symbol.  It
becomes a problem when "time" or "times" is defined as a variable in
an executable, clashing with functions of the same name in libc.  If
a symbol isn't undefined weak symbol, don't make it dynamic in PIE and
generate R_386_RELATIVE relocation.

bfd/

PR ld/21402
* elf32-i386.c (elf_i386_link_hash_entry): Add
no_finish_dynamic_symbol.
(elf_i386_link_hash_newfunc): Set no_finish_dynamic_symbol to 0.
(elf_i386_allocate_dynrelocs): If a symbol isn't undefined weak
symbol, don't make it dynamic in PIE.
(elf_i386_relocate_section): If a symbol isn't dynamic in PIE,
set no_finish_dynamic_symbol and generate R_386_RELATIVE
relocation for R_386_GOT32
(elf_i386_finish_dynamic_symbol): Abort if no_finish_dynamic_symbol
isn't 0.

ld/

PR ld/21402
* testsuite/ld-elf/indirect.exp: Don't skip PIE indirect5 and
indirect6 tests on i386.
bfd/ChangeLog
bfd/elf32-i386.c
ld/ChangeLog
ld/testsuite/ld-elf/indirect.exp