x86: Update UNDEFINED_WEAK_RESOLVED_TO_ZERO
Since the only information which SYMBOL_REFERENCES_LOCAL_P doesn't check is relocations, UNDEFINED_WEAK_RESOLVED_TO_ZERO only needs to check for relocations with SYMBOL_REFERENCES_LOCAL_P. * elf32-i386.c (elf_i386_relocate_section): Update usage of UNDEFINED_WEAK_RESOLVED_TO_ZERO. (elf_i386_finish_dynamic_symbol): Likewise. * elf64-x86-64.c (elf_x86_64_relocate_section): Likewise. (elf_x86_64_finish_dynamic_symbol): Likewise. * elfxx-x86.c (elf_x86_allocate_dynrelocs): Likewise. (_bfd_x86_elf_fixup_symbol): Likewise.
This commit is contained in:
parent
8fbf0ba18c
commit
c5bce5c697
|
@ -1,3 +1,13 @@
|
|||
2017-09-09 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* elf32-i386.c (elf_i386_relocate_section): Update usage of
|
||||
UNDEFINED_WEAK_RESOLVED_TO_ZERO.
|
||||
(elf_i386_finish_dynamic_symbol): Likewise.
|
||||
* elf64-x86-64.c (elf_x86_64_relocate_section): Likewise.
|
||||
(elf_x86_64_finish_dynamic_symbol): Likewise.
|
||||
* elfxx-x86.c (elf_x86_allocate_dynrelocs): Likewise.
|
||||
(_bfd_x86_elf_fixup_symbol): Likewise.
|
||||
|
||||
2017-09-09 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* elfxx-x86.c (_bfd_x86_elf_link_symbol_references_local): Don't
|
||||
|
|
|
@ -2466,10 +2466,7 @@ do_ifunc_pointer:
|
|||
}
|
||||
|
||||
resolved_to_zero = (eh != NULL
|
||||
&& UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
|
||||
I386_ELF_DATA,
|
||||
eh->has_got_reloc,
|
||||
eh));
|
||||
&& UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
|
||||
|
||||
switch (r_type)
|
||||
{
|
||||
|
@ -3623,9 +3620,7 @@ elf_i386_finish_dynamic_symbol (bfd *output_bfd,
|
|||
/* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
|
||||
resolved undefined weak symbols in executable so that their
|
||||
references have value 0 at run-time. */
|
||||
local_undefweak = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, I386_ELF_DATA,
|
||||
eh->has_got_reloc,
|
||||
eh);
|
||||
local_undefweak = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
|
||||
|
||||
if (h->plt.offset != (bfd_vma) -1)
|
||||
{
|
||||
|
|
|
@ -2766,10 +2766,7 @@ do_ifunc_pointer:
|
|||
}
|
||||
|
||||
resolved_to_zero = (eh != NULL
|
||||
&& UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
|
||||
X86_64_ELF_DATA,
|
||||
eh->has_got_reloc,
|
||||
eh));
|
||||
&& UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh));
|
||||
|
||||
/* When generating a shared object, the relocations handled here are
|
||||
copied into the output file to be resolved at run time. */
|
||||
|
@ -3985,10 +3982,7 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
|
|||
/* We keep PLT/GOT entries without dynamic PLT/GOT relocations for
|
||||
resolved undefined weak symbols in executable so that their
|
||||
references have value 0 at run-time. */
|
||||
local_undefweak = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
|
||||
X86_64_ELF_DATA,
|
||||
eh->has_got_reloc,
|
||||
eh);
|
||||
local_undefweak = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
|
||||
|
||||
if (h->plt.offset != (bfd_vma) -1)
|
||||
{
|
||||
|
|
|
@ -107,10 +107,7 @@ elf_x86_allocate_dynrelocs (struct elf_link_hash_entry *h,
|
|||
|
||||
plt_entry_size = htab->plt.plt_entry_size;
|
||||
|
||||
resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
|
||||
bed->target_id,
|
||||
eh->has_got_reloc,
|
||||
eh);
|
||||
resolved_to_zero = UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, eh);
|
||||
|
||||
/* Clear the reference count of function pointer relocations if
|
||||
symbol isn't a normal function. */
|
||||
|
@ -1446,19 +1443,12 @@ bfd_boolean
|
|||
_bfd_x86_elf_fixup_symbol (struct bfd_link_info *info,
|
||||
struct elf_link_hash_entry *h)
|
||||
{
|
||||
if (h->dynindx != -1)
|
||||
if (h->dynindx != -1
|
||||
&& UNDEFINED_WEAK_RESOLVED_TO_ZERO (info, elf_x86_hash_entry (h)))
|
||||
{
|
||||
const struct elf_backend_data *bed
|
||||
= get_elf_backend_data (info->output_bfd);
|
||||
if (UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
|
||||
bed->target_id,
|
||||
elf_x86_hash_entry (h)->has_got_reloc,
|
||||
elf_x86_hash_entry (h)))
|
||||
{
|
||||
h->dynindx = -1;
|
||||
_bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
|
||||
h->dynstr_index);
|
||||
}
|
||||
h->dynindx = -1;
|
||||
_bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
|
||||
h->dynstr_index);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
@ -56,14 +56,12 @@
|
|||
2. Has no GOT/PLT relocation.
|
||||
Local undefined weak symbol is always resolved to 0.
|
||||
*/
|
||||
#define UNDEFINED_WEAK_RESOLVED_TO_ZERO(INFO, ID, GOT_RELOC, EH) \
|
||||
#define UNDEFINED_WEAK_RESOLVED_TO_ZERO(INFO, EH) \
|
||||
((EH)->elf.root.type == bfd_link_hash_undefweak \
|
||||
&& (SYMBOL_REFERENCES_LOCAL_P ((INFO), &(EH)->elf) \
|
||||
|| (bfd_link_executable (INFO) \
|
||||
&& (elf_x86_hash_table ((INFO), (ID))->interp == NULL \
|
||||
|| !(GOT_RELOC) \
|
||||
|| (EH)->has_non_got_reloc \
|
||||
|| !(INFO)->dynamic_undefined_weak))))
|
||||
&& (!(EH)->has_got_reloc \
|
||||
|| (EH)->has_non_got_reloc))))
|
||||
|
||||
/* Should copy relocation be generated for a symbol. Don't generate
|
||||
copy relocation against a protected symbol defined in a shared
|
||||
|
|
Loading…
Reference in New Issue