i386: Force symbol dynamic if it isn't undefined weak

Force symbol dynamic if it isn't undefined weak.  Generate R_386_RELATIVE
relocation for R_386_GOT32 relocation against non-dynamic symbol in PIC.

	PR ld/21402
	* elf32-i386.c (elf_i386_allocate_dynrelocs): If a symbol isn't
	undefined weak symbol, don't make it dynamic.
	(elf_i386_relocate_section): If a symbol isn't dynamic in PIC,
	set no_finish_dynamic_symbol and generate R_386_RELATIVE
	relocation for R_386_GOT32.
This commit is contained in:
H.J. Lu
2017-04-24 13:42:33 -07:00
parent e1ba30532c
commit 0dc9a308a1
2 changed files with 17 additions and 9 deletions

View File

@ -1,3 +1,12 @@
2017-04-24 H.J. Lu <hongjiu.lu@intel.com>
PR ld/21402
* elf32-i386.c (elf_i386_allocate_dynrelocs): If a symbol isn't
undefined weak symbol, don't make it dynamic.
(elf_i386_relocate_section): If a symbol isn't dynamic in PIC,
set no_finish_dynamic_symbol and generate R_386_RELATIVE
relocation for R_386_GOT32.
2017-04-24 H.J. Lu <hongjiu.lu@intel.com> 2017-04-24 H.J. Lu <hongjiu.lu@intel.com>
PR ld/21425 PR ld/21425

View File

@ -2748,7 +2748,8 @@ elf_i386_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
Undefined weak syms won't yet be marked as dynamic. */ Undefined weak syms won't yet be marked as dynamic. */
if (h->dynindx == -1 if (h->dynindx == -1
&& !h->forced_local && !h->forced_local
&& !resolved_to_zero) && !resolved_to_zero
&& h->root.type == bfd_link_hash_undefweak)
{ {
if (! bfd_elf_link_record_dynamic_symbol (info, h)) if (! bfd_elf_link_record_dynamic_symbol (info, h))
return FALSE; return FALSE;
@ -2867,14 +2868,11 @@ elf_i386_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
int tls_type = elf_i386_hash_entry(h)->tls_type; int tls_type = elf_i386_hash_entry(h)->tls_type;
/* Make sure this symbol is output as a dynamic symbol. /* Make sure this symbol is output as a dynamic symbol.
Undefined weak syms won't yet be marked as dynamic. Undefined weak syms won't yet be marked as dynamic. */
PR ld/21402: If this symbol isn't undefined weak symbol,
don't make it dynamic in PIE. */
if (h->dynindx == -1 if (h->dynindx == -1
&& !h->forced_local && !h->forced_local
&& !resolved_to_zero && !resolved_to_zero
&& (h->root.type == bfd_link_hash_undefweak && h->root.type == bfd_link_hash_undefweak)
|| !bfd_link_pie (info)))
{ {
if (! bfd_elf_link_record_dynamic_symbol (info, h)) if (! bfd_elf_link_record_dynamic_symbol (info, h))
return FALSE; return FALSE;
@ -3035,7 +3033,8 @@ elf_i386_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
Undefined weak syms won't yet be marked as dynamic. */ Undefined weak syms won't yet be marked as dynamic. */
if (h->dynindx == -1 if (h->dynindx == -1
&& !h->forced_local && !h->forced_local
&& !resolved_to_zero) && !resolved_to_zero
&& h->root.type == bfd_link_hash_undefweak)
{ {
if (! bfd_elf_link_record_dynamic_symbol (info, h)) if (! bfd_elf_link_record_dynamic_symbol (info, h))
return FALSE; return FALSE;
@ -4315,10 +4314,10 @@ r_386_got32:
if (h->dynindx == -1 if (h->dynindx == -1
&& !h->forced_local && !h->forced_local
&& h->root.type != bfd_link_hash_undefweak && h->root.type != bfd_link_hash_undefweak
&& bfd_link_pie (info)) && bfd_link_pic (info))
{ {
/* PR ld/21402: If this symbol isn't dynamic /* PR ld/21402: If this symbol isn't dynamic
in PIE, generate R_386_RELATIVE here. */ in PIC, generate R_386_RELATIVE here. */
eh->no_finish_dynamic_symbol = 1; eh->no_finish_dynamic_symbol = 1;
relative_reloc = TRUE; relative_reloc = TRUE;
} }