From: H.J. Lu Date: Mon, 24 Apr 2017 20:42:33 +0000 (-0700) Subject: i386: Force symbol dynamic if it isn't undefined weak X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0dc9a308a1ec9675bf6b33bae9e8b1faa0bad9ed;p=binutils-gdb.git 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. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 6b969d63706..54e2f0dbb97 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2017-04-24 H.J. Lu + + 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 PR ld/21425 diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 83f3b11e659..9a568ce522b 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -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. */ if (h->dynindx == -1 && !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)) 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; /* Make sure this symbol is output as a dynamic symbol. - 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. */ + Undefined weak syms won't yet be marked as dynamic. */ if (h->dynindx == -1 && !h->forced_local && !resolved_to_zero - && (h->root.type == bfd_link_hash_undefweak - || !bfd_link_pie (info))) + && h->root.type == bfd_link_hash_undefweak) { if (! bfd_elf_link_record_dynamic_symbol (info, h)) 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. */ if (h->dynindx == -1 && !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)) return FALSE; @@ -4315,10 +4314,10 @@ r_386_got32: if (h->dynindx == -1 && !h->forced_local && h->root.type != bfd_link_hash_undefweak - && bfd_link_pie (info)) + && bfd_link_pic (info)) { /* 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; relative_reloc = TRUE; }