hppa: Check UNDEFWEAK_NO_DYNAMIC_RELOC

Don't generate dynamic relocation against weak undefined symbol if it
is resolved to zero.  FIXME: UNDEFWEAK_NO_DYNAMIC_RELOC may need to be
checked in more places.

	PR ld/22269
	* elf32-hppa.c (ensure_undef_dynamic): Don't make undefined
	symbol dynamic if UNDEFWEAK_NO_DYNAMIC_RELOC is true.
	(allocate_dynrelocs): Discard dynamic relocations if
	UNDEFWEAK_NO_DYNAMIC_RELOC is true.
	(elf32_hppa_relocate_section): Don't generate dynamic
	relocation if UNDEFWEAK_NO_DYNAMIC_RELOC is true.
This commit is contained in:
H.J. Lu 2017-10-14 10:54:50 -07:00
parent db41f6eb52
commit 60c1b909df
2 changed files with 19 additions and 2 deletions

View File

@ -1,3 +1,13 @@
2017-10-14 H.J. Lu <hongjiu.lu@intel.com>
PR ld/22269
* elf32-hppa.c (ensure_undef_dynamic): Don't make undefined
symbol dynamic if UNDEFWEAK_NO_DYNAMIC_RELOC is true.
(allocate_dynrelocs): Discard dynamic relocations if
UNDEFWEAK_NO_DYNAMIC_RELOC is true.
(elf32_hppa_relocate_section): Don't generate dynamic
relocation if UNDEFWEAK_NO_DYNAMIC_RELOC is true.
2017-10-14 H.J. Lu <hongjiu.lu@intel.com> 2017-10-14 H.J. Lu <hongjiu.lu@intel.com>
PR ld/22269 PR ld/22269

View File

@ -1933,6 +1933,7 @@ ensure_undef_dynamic (struct bfd_link_info *info,
&& eh->dynindx == -1 && eh->dynindx == -1
&& !eh->forced_local && !eh->forced_local
&& eh->type != STT_PARISC_MILLI && eh->type != STT_PARISC_MILLI
&& !UNDEFWEAK_NO_DYNAMIC_RELOC (info, eh)
&& ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT) && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT)
return bfd_elf_link_record_dynamic_symbol (info, eh); return bfd_elf_link_record_dynamic_symbol (info, eh);
return TRUE; return TRUE;
@ -2077,7 +2078,8 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
/* Discard relocs on undefined syms with non-default visibility. */ /* Discard relocs on undefined syms with non-default visibility. */
if ((eh->root.type == bfd_link_hash_undefined if ((eh->root.type == bfd_link_hash_undefined
|| eh->root.type == bfd_link_hash_undefweak) || eh->root.type == bfd_link_hash_undefweak)
&& ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT) && (ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT
|| UNDEFWEAK_NO_DYNAMIC_RELOC (info, eh)))
hh->dyn_relocs = NULL; hh->dyn_relocs = NULL;
#if RELATIVE_DYNRELOCS #if RELATIVE_DYNRELOCS
@ -3672,6 +3674,7 @@ elf32_hppa_relocate_section (bfd *output_bfd,
const char *sym_name; const char *sym_name;
bfd_boolean plabel; bfd_boolean plabel;
bfd_boolean warned_undef; bfd_boolean warned_undef;
bfd_boolean resolved_to_zero;
r_type = ELF32_R_TYPE (rela->r_info); r_type = ELF32_R_TYPE (rela->r_info);
if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED) if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
@ -3735,6 +3738,9 @@ elf32_hppa_relocate_section (bfd *output_bfd,
if (bfd_link_relocatable (info)) if (bfd_link_relocatable (info))
continue; continue;
resolved_to_zero = (hh != NULL
&& UNDEFWEAK_NO_DYNAMIC_RELOC (info, &hh->eh));
/* Do any required modifications to the relocation value, and /* Do any required modifications to the relocation value, and
determine what types of dynamic info we need to output, if determine what types of dynamic info we need to output, if
any. */ any. */
@ -3965,7 +3971,8 @@ elf32_hppa_relocate_section (bfd *output_bfd,
there all files have not been loaded. */ there all files have not been loaded. */
if ((bfd_link_pic (info) if ((bfd_link_pic (info)
&& (hh == NULL && (hh == NULL
|| ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT || (ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
&& !resolved_to_zero)
|| hh->eh.root.type != bfd_link_hash_undefweak) || hh->eh.root.type != bfd_link_hash_undefweak)
&& (IS_ABSOLUTE_RELOC (r_type) && (IS_ABSOLUTE_RELOC (r_type)
|| !SYMBOL_CALLS_LOCAL (info, &hh->eh))) || !SYMBOL_CALLS_LOCAL (info, &hh->eh)))