cris: Check UNDEFWEAK_NO_DYNAMIC_RELOC
authorH.J. Lu <hjl.tools@gmail.com>
Sat, 14 Oct 2017 18:09:29 +0000 (11:09 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Sat, 14 Oct 2017 18:09:44 +0000 (11:09 -0700)
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.

bfd/

PR ld/22269
* elf32-cris.c (cris_elf_relocate_section): Don't generate
dynamic relocation if UNDEFWEAK_NO_DYNAMIC_RELOC is true.
(cris_elf_check_relocs): Don't allocate dynamic relocation
if UNDEFWEAK_NO_DYNAMIC_RELOC is true.

ld/

PR ld/22269
* testsuite/ld-cris/weakhiddso.d: Update and remove R_CRIS_NONE.

bfd/ChangeLog
bfd/elf32-cris.c
ld/ChangeLog
ld/testsuite/ld-cris/weakhiddso.d

index fc1d0f56a85940c75a1d40c1e69e3bf0d518feca..9a124bd3b49a04fdca7b244071d37453856a140b 100644 (file)
@@ -1,3 +1,11 @@
+2017-10-14  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/22269
+       * elf32-cris.c (cris_elf_relocate_section): Don't generate
+       dynamic relocation if UNDEFWEAK_NO_DYNAMIC_RELOC is true.
+       (cris_elf_check_relocs): Don't allocate dynamic relocation
+       if UNDEFWEAK_NO_DYNAMIC_RELOC is true.
+
 2017-10-14  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/22269
index a4dc86fc9c7caadff3dc289b0ed9aa3f8795b226..4c80d002cc8ff775b5e6e59d28b2bcdaf936ef09 100644 (file)
@@ -1018,6 +1018,7 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
       bfd_reloc_status_type r;
       const char *symname = NULL;
       enum elf_cris_reloc_type r_type;
+      bfd_boolean resolved_to_zero;
 
       r_type = ELF32_R_TYPE (rel->r_info);
 
@@ -1130,6 +1131,9 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
       if (bfd_link_relocatable (info))
        continue;
 
+      resolved_to_zero = (h != NULL
+                         && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
+
       switch (r_type)
        {
        case R_CRIS_16_GOTPLT:
@@ -1432,6 +1436,7 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
        case R_CRIS_16:
        case R_CRIS_32:
          if (bfd_link_pic (info)
+             && !resolved_to_zero
              && r_symndx != STN_UNDEF
              && (input_section->flags & SEC_ALLOC) != 0
              && ((r_type != R_CRIS_8_PCREL
@@ -3540,7 +3545,8 @@ cris_elf_check_relocs (bfd *abfd,
             render the symbol local.  */
 
          /* No need to do anything if we're not creating a shared object.  */
-         if (! bfd_link_pic (info))
+         if (! bfd_link_pic (info)
+             || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
            break;
 
          /* We may need to create a reloc section in the dynobj and made room
index 47cc5a89b06bc0a25d1832266b774f4a3da65564..6e7e58dfc492991fb96d2cf6bac4edb08d1eb747 100644 (file)
@@ -1,3 +1,8 @@
+2017-10-14  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/22269
+       * testsuite/ld-cris/weakhiddso.d: Update and remove R_CRIS_NONE.
+
 2017-10-13  Alan Modra  <amodra@gmail.com>
 
        PR ld/22263
index 71a4bdb7b47550f0a72c5aa1d876a5e6fc5f6439..c9c793e860c22bd9b1a8414d798e962e5af7b2e1 100644 (file)
@@ -4,28 +4,26 @@
 #objdump: -s -R -T
 
 # Check that .weak and .weak .hidden object references are handled
-# correctly when generating a DSO.  For now, we have to live with the
-# R_CRIS_NONE entry.
+# correctly when generating a DSO.
 
 .*:     file format elf32-cris
 
 DYNAMIC SYMBOL TABLE:
-0+2214 l    d  \.data  0+ \.data
-0+2214 g    DO \.data  0+c x
+0+2208 l    d  \.data  0+ \.data
+0+2208 g    DO \.data  0+c x
 0+      D  \*UND\*     0+ xregobj
-0+2220 g    D  \.data  0+ __bss_start
+0+2214 g    D  \.data  0+ __bss_start
 0+  w   D  \*UND\*     0+ xweakobj
-0+2220 g    D  \.data  0+ _edata
+0+2214 g    D  \.data  0+ _edata
 0+2220 g    D  \.data  0+ _end
 
 
 DYNAMIC RELOCATION RECORDS
 OFFSET   TYPE              VALUE 
-0+ R_CRIS_NONE       \*ABS\*
-0+2218 R_CRIS_32         xweakobj
-0+221c R_CRIS_32         xregobj
+0+220c R_CRIS_32         xweakobj
+0+2210 R_CRIS_32         xregobj
 
 Contents of section \.hash:
 #...
 Contents of section \.data:
- 2214 00000000 00000000 00000000           .*
+ 2208 00000000 00000000 00000000           .*