]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Fix --gc-sections failure with symbol versioning.
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 5 Oct 2011 16:39:55 +0000 (16:39 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 5 Oct 2011 16:39:55 +0000 (16:39 +0000)
bfd/

2011-09-29  H.J. Lu  <hongjiu.lu@intel.com>

PR ld/13195
* elflink.c (_bfd_elf_merge_symbol): Don't set dynamic_def when
clearing def_dynamic.
(elf_link_add_object_symbols): Likewise.  Set dynamic_def when
setting def_dynamic.
(bfd_elf_gc_mark_dynamic_ref_symbol): Check if a symbol is
versioned.

ld/testsuite/

2011-09-29  H.J. Lu  <hongjiu.lu@intel.com>

PR ld/13195
* ld-elf/elf.exp: Add a C link testcase for PR ld/13195.

* ld-elf/pr13195.c: New.
* ld-elf/pr13195.d: Likewise.
* ld-elf/pr13195.s: Likewise.
* ld-elf/pr13195.t: Likewise.

bfd/ChangeLog
bfd/elflink.c
ld/testsuite/ChangeLog
ld/testsuite/ld-elf/elf.exp

index d5af9dbced05ee03feae70861ccb145ee40c9db8..c5334c95ab28eec097a8ab3553a9403200c49e3e 100644 (file)
@@ -1,3 +1,13 @@
+2011-09-29  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/13195
+       * elflink.c (_bfd_elf_merge_symbol): Don't set dynamic_def when
+       clearing def_dynamic.
+       (elf_link_add_object_symbols): Likewise.  Set dynamic_def when
+       setting def_dynamic.
+       (bfd_elf_gc_mark_dynamic_ref_symbol): Check if a symbol is
+       versioned.
+
 2011-09-29  Alan Modra  <amodra@gmail.com>
 
        PR ld/13233
index 9bd2c5c9d42140d506e870be0eece3755324b069..5d181f7993c2fe76fdcd03cf19efeac6c2bb8ab5 100644 (file)
@@ -1238,7 +1238,6 @@ _bfd_elf_merge_symbol (bfd *abfd,
        {
          h->def_dynamic = 0;
          h->ref_dynamic = 1;
-         h->dynamic_def = 1;
        }
       /* FIXME: Should we check type and size for protected symbol?  */
       h->size = 0;
@@ -4353,7 +4352,6 @@ error_free_dyn:
                    {
                      h->def_dynamic = 0;
                      h->ref_dynamic = 1;
-                     h->dynamic_def = 1;
                    }
                }
              if (! info->executable
@@ -4366,7 +4364,10 @@ error_free_dyn:
              if (! definition)
                h->ref_dynamic = 1;
              else
-               h->def_dynamic = 1;
+               {
+                 h->def_dynamic = 1;
+                 h->dynamic_def = 1;
+               }
              if (h->def_regular
                  || h->ref_regular
                  || (h->u.weakdef != NULL
@@ -11915,8 +11916,9 @@ bfd_elf_gc_mark_dynamic_ref_symbol (struct elf_link_hash_entry *h, void *inf)
              && h->def_regular
              && ELF_ST_VISIBILITY (h->other) != STV_INTERNAL
              && ELF_ST_VISIBILITY (h->other) != STV_HIDDEN
-             && !bfd_hide_sym_by_version (info->version_info,
-                                          h->root.root.string))))
+             && (strchr (h->root.root.string, ELF_VER_CHR) != NULL
+                 || !bfd_hide_sym_by_version (info->version_info,
+                                              h->root.root.string)))))
     h->root.u.def.section->flags |= SEC_KEEP;
 
   return TRUE;
index be38879a39ee81be789e09c4a2c568ce7af37a81..482d2b7fcac014c88c46eb78750b3292cd2538e3 100644 (file)
@@ -1,3 +1,13 @@
+2011-09-29  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/13195
+       * ld-elf/elf.exp: Add a C link testcase for PR ld/13195.
+
+       * ld-elf/pr13195.c: New.
+       * ld-elf/pr13195.d: Likewise.
+       * ld-elf/pr13195.s: Likewise.
+       * ld-elf/pr13195.t: Likewise.
+
 2011-09-16  H.J. Lu  <hongjiu.lu@intel.com>
 
        * ld-elf/pr12975.d: Only run for *-*-linux* and *-*-gnu*
index 4a00b81ced0474d815704a4c6c7ccb9fa164ef2f..866c86682ec95c7daad115d52a789ac10f0272b1 100644 (file)
@@ -138,6 +138,11 @@ if ![isnative] {
     return
 }
 
+run_cc_link_tests {
+    {"PR ld/13195" "-Wl,--gc-sections" ""
+     {pr13195.c} {} "pr13195"}
+}
+
 set array_tests {
     {"preinit array" "" "" {preinit.c} "preinit" "preinit.out"}
     {"init array" "" "" {init.c} "init" "init.out"}