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:
H.J. Lu 2017-09-09 07:29:15 -07:00
parent 8fbf0ba18c
commit c5bce5c697
5 changed files with 23 additions and 36 deletions

View File

@ -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

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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;
}

View File

@ -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