Don't change the default symbol for relocatable link
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 30 Jul 2015 10:27:44 +0000 (03:27 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 30 Jul 2015 10:28:00 +0000 (03:28 -0700)
We should change the default symbol for the versioned symbol only when
not performing a relocatable link.

bfd/

PR ld/18735
* elflink.c (_bfd_elf_add_default_symbol): Add the default
symbol if not performing a relocatable link.
(elf_link_add_object_symbols): Adjust the default symbol if
not performing a relocatable link.

ld/testsuite/

PR ld/18735
* ld-elf/pr18735.d: New file.
* ld-elf/pr18735.s: Likewise.

bfd/ChangeLog
bfd/elflink.c
ld/testsuite/ChangeLog
ld/testsuite/ld-elf/pr18735.d [new file with mode: 0644]
ld/testsuite/ld-elf/pr18735.s [new file with mode: 0644]

index e3339d0..e9776bf 100644 (file)
@@ -1,3 +1,11 @@
+2015-07-30  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/18735
+       * elflink.c (_bfd_elf_add_default_symbol): Add the default
+       symbol if not performing a relocatable link.
+       (elf_link_add_object_symbols): Adjust the default symbol if
+       not performing a relocatable link.
+
 2015-07-29  H.J. Lu  <hongjiu.lu@intel.com>
 
        * elflink.c (elf_link_add_object_symbols): Remove
index fc1fd08..846f35e 100644 (file)
@@ -1655,12 +1655,17 @@ _bfd_elf_add_default_symbol (bfd *abfd,
 
   if (! override)
     {
-      bh = &hi->root;
-      if (! (_bfd_generic_link_add_one_symbol
-            (info, abfd, shortname, BSF_INDIRECT, bfd_ind_section_ptr,
-             0, name, FALSE, collect, &bh)))
-       return FALSE;
-      hi = (struct elf_link_hash_entry *) bh;
+      /* Add the default symbol if not performing a relocatable link.  */
+      if (! info->relocatable)
+       {
+         bh = &hi->root;
+         if (! (_bfd_generic_link_add_one_symbol
+                (info, abfd, shortname, BSF_INDIRECT,
+                 bfd_ind_section_ptr,
+                 0, name, FALSE, collect, &bh)))
+           return FALSE;
+         hi = (struct elf_link_hash_entry *) bh;
+       }
     }
   else
     {
@@ -4609,9 +4614,10 @@ error_free_dyn:
       old_tab = NULL;
     }
 
-  /* Now that all the symbols from this input file are created, handle
-     .symver foo, foo@BAR such that any relocs against foo become foo@BAR.  */
-  if (nondeflt_vers != NULL)
+  /* Now that all the symbols from this input file are created, if
+     not performing a relocatable link, handle .symver foo, foo@BAR
+     such that any relocs against foo become foo@BAR.  */
+  if (!info->relocatable && nondeflt_vers != NULL)
     {
       bfd_size_type cnt, symidx;
 
index 267361f..c35d4a7 100644 (file)
@@ -1,3 +1,9 @@
+2015-07-30  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/18735
+       * ld-elf/pr18735.d: New file.
+       * ld-elf/pr18735.s: Likewise.
+
 2015-07-29  H.J. Lu  <hongjiu.lu@intel.com>
 
        * ld-elf/pr18718.c (bar): Use noclone attribute only for GCC
diff --git a/ld/testsuite/ld-elf/pr18735.d b/ld/testsuite/ld-elf/pr18735.d
new file mode 100644 (file)
index 0000000..8ec0938
--- /dev/null
@@ -0,0 +1,10 @@
+#ld: -r
+#readelf: -s
+
+Symbol table '.symtab' contains .* entries:
+#...
+[      ]*[0-9]+: [0-9a-fA-F]* +1 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +foo@FOO
+[      ]*[0-9]+: [0-9a-fA-F]* +1 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +bar@@FOO
+[      ]*[0-9]+: [0-9a-fA-F]* +1 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +foo
+[      ]*[0-9]+: [0-9a-fA-F]* +1 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +bar
+#pass
diff --git a/ld/testsuite/ld-elf/pr18735.s b/ld/testsuite/ld-elf/pr18735.s
new file mode 100644 (file)
index 0000000..aae609d
--- /dev/null
@@ -0,0 +1,13 @@
+       .data
+       .symver foo, foo@FOO
+       .symver bar, bar@@FOO
+       .globl  foo
+       .type   foo, %object
+foo:
+       .byte 0
+       .size   foo, .-foo
+       .globl  bar
+       .type   bar, %object
+bar:
+       .byte 0
+       .size   bar, .-bar