mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-22 19:09:31 +08:00
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:
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user