[binutils-gdb] xtensa: don't emit dynamic relocation for weak undefined symbol

Max Filippov jcmvbkbc@sourceware.org
Fri Jul 6 23:07:00 GMT 2018


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=c451bb34ae8bd2d0669bd563366883cfbcf0de9b

commit c451bb34ae8bd2d0669bd563366883cfbcf0de9b
Author: Max Filippov <jcmvbkbc@gmail.com>
Date:   Mon Jul 2 11:12:44 2018 -0700

    xtensa: don't emit dynamic relocation for weak undefined symbol
    
    Resolved reference to a weak undefined symbol in PIE must not have
    a dynamic relative relocation against itself, otherwise the value of a
    reference will be changed from 0 to the base of executable, breaking
    code like the following:
    
      void weak_function (void);
      if (weak_function)
        weak_function ();
    
    This fixes tests for PR ld/22269 and a number of PIE tests in xtensa gcc
    testsuite.
    
    bfd/
    2018-07-06  Max Filippov  <jcmvbkbc@gmail.com>
    
    	* elf32-xtensa.c (elf_xtensa_allocate_dynrelocs): Don't allocate
    	space for dynamic relocation for undefined weak symbol.
    	(elf_xtensa_relocate_section): Don't emit R_XTENSA_RELATIVE
    	relocation for undefined weak symbols.
    	(shrink_dynamic_reloc_sections): Don't shrink dynamic relocation
    	section for relocations against undefined weak symbols.

Diff:
---
 bfd/ChangeLog      |  9 +++++++++
 bfd/elf32-xtensa.c | 13 +++++++++++--
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 16d6daf..812b8bc 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,12 @@
+2018-07-06  Max Filippov  <jcmvbkbc@gmail.com>
+
+	* elf32-xtensa.c (elf_xtensa_allocate_dynrelocs): Don't allocate
+	space for dynamic relocation for undefined weak symbol.
+	(elf_xtensa_relocate_section): Don't emit R_XTENSA_RELATIVE
+	relocation for undefined weak symbols.
+	(shrink_dynamic_reloc_sections): Don't shrink dynamic relocation
+	section for relocations against undefined weak symbols.
+
 2018-07-06  Alan Hayward  <alan.hayward@arm.com>
 
 	* elf.c (elfcore_grok_aarch_sve): New function.
diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c
index 44c1074..f7f569d 100644
--- a/bfd/elf32-xtensa.c
+++ b/bfd/elf32-xtensa.c
@@ -1437,6 +1437,10 @@ elf_xtensa_allocate_dynrelocs (struct elf_link_hash_entry *h, void *arg)
   if (! elf_xtensa_dynamic_symbol_p (h, info))
     elf_xtensa_make_sym_local (info, h);
 
+  if (! elf_xtensa_dynamic_symbol_p (h, info)
+      && h->root.type == bfd_link_hash_undefweak)
+    return TRUE;
+
   if (h->plt.refcount > 0)
     htab->elf.srelplt->size += (h->plt.refcount * sizeof (Elf32_External_Rela));
 
@@ -2777,12 +2781,16 @@ elf_xtensa_relocate_section (bfd *output_bfd,
 			}
 		      unresolved_reloc = FALSE;
 		    }
-		  else
+		  else if (!is_weak_undef)
 		    {
 		      /* Generate a RELATIVE relocation.  */
 		      outrel.r_info = ELF32_R_INFO (0, R_XTENSA_RELATIVE);
 		      outrel.r_addend = 0;
 		    }
+		  else
+		    {
+		      continue;
+		    }
 		}
 
 	      loc = (srel->contents
@@ -10013,7 +10021,8 @@ shrink_dynamic_reloc_sections (struct bfd_link_info *info,
 
   if ((r_type == R_XTENSA_32 || r_type == R_XTENSA_PLT)
       && (input_section->flags & SEC_ALLOC) != 0
-      && (dynamic_symbol || bfd_link_pic (info)))
+      && (dynamic_symbol || bfd_link_pic (info))
+      && (!h || h->root.type != bfd_link_hash_undefweak))
     {
       asection *srel;
       bfd_boolean is_plt = FALSE;



More information about the Binutils-cvs mailing list