[PATCH 02/12] aarch64: Check UNDEFWEAK_NO_DYNAMIC_RELOC

H.J. Lu hjl.tools@gmail.com
Thu Oct 12 13:10:00 GMT 2017


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
	* elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Don't
	generate dynamic relocation if UNDEFWEAK_NO_DYNAMIC_RELOC is
	true.
	(elfNN_aarch64_allocate_dynrelocs): Discard dynamic relocations
	if UNDEFWEAK_NO_DYNAMIC_RELOC is true.
---
 bfd/elfnn-aarch64.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c
index 92970561ee..2539bb4db9 100644
--- a/bfd/elfnn-aarch64.c
+++ b/bfd/elfnn-aarch64.c
@@ -4951,6 +4951,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
   bfd_boolean relative_reloc;
   asection *base_got;
   bfd_vma orig_value = value;
+  bfd_boolean resolved_to_zero;
 
   globals = elf_aarch64_hash_table (info);
 
@@ -5176,6 +5177,9 @@ bad_ifunc_reloc:
 	}
     }
 
+  resolved_to_zero = (h != NULL
+		      && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
+
   switch (bfd_r_type)
     {
     case BFD_RELOC_AARCH64_NONE:
@@ -5194,7 +5198,8 @@ bad_ifunc_reloc:
 	    || globals->root.is_relocatable_executable)
 	   && (input_section->flags & SEC_ALLOC)
 	   && (h == NULL
-	       || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
+	       || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
+		   && !resolved_to_zero)
 	       || h->root.type != bfd_link_hash_undefweak))
 	  /* Or we are creating an executable, we may need to keep relocations
 	     for symbols satisfied by a dynamic library if we manage to avoid
@@ -8285,7 +8290,8 @@ elfNN_aarch64_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
          visibility.  */
       if (eh->dyn_relocs != NULL && h->root.type == bfd_link_hash_undefweak)
 	{
-	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
+	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
+	      || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
 	    eh->dyn_relocs = NULL;
 
 	  /* Make sure undefined weak symbols are output as a dynamic
-- 
2.13.6



More information about the Binutils mailing list