Put soname in the version definition section
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 17 Apr 2017 14:47:17 +0000 (07:47 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 17 Apr 2017 14:47:32 +0000 (07:47 -0700)
commit 902e9fc76a0ec9f642cefa71ef88cca1c675ad54
Author: Maciej W. Rozycki <macro@imgtec.com>
Date:   Tue Feb 21 01:46:42 2017 +0000

    PR ld/20828: Move symbol version processing ahead of GC symbol sweep

breaks version definition with --version-script --soname.  This patch
fixes it by getting soname index before generating the version definition
section.

bfd/

PR ld/21389
* elflink.c (bfd_elf_size_dynamic_sections): Get soname index
before generating the version definition section.

ld/

PR ld/21389
* testsuite/ld-elf/pr21389.map: New file.
* testsuite/ld-elf/pr21389.s: Likewise.
* testsuite/ld-elf/pr21389a.d: Likewise.
* testsuite/ld-elf/pr21389b.d: Likewise.
* testsuite/ld-elf/pr21389c.d: Likewise.

bfd/ChangeLog
bfd/elflink.c
ld/ChangeLog
ld/testsuite/ld-elf/pr21389.map [new file with mode: 0644]
ld/testsuite/ld-elf/pr21389.s [new file with mode: 0644]
ld/testsuite/ld-elf/pr21389a.d [new file with mode: 0644]
ld/testsuite/ld-elf/pr21389b.d [new file with mode: 0644]
ld/testsuite/ld-elf/pr21389c.d [new file with mode: 0644]

index b113a8b170ab7464ba7da84905aa98229827e636..f1ca8b4755e41fe6c5162c5bf4b1fa5f861ac7e1 100644 (file)
@@ -1,3 +1,9 @@
+2017-04-17  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/21389
+       * elflink.c (bfd_elf_size_dynamic_sections): Get soname index
+       before generating the version definition section.
+
 2017-04-17  Alan Modra  <amodra@gmail.com>
 
        * elflink.c (_bfd_elf_merge_symbol): Undo dynamic linking
index ec2032ba483d355f27ab73ccf69cf1c59eacd7bf..b93d4f37c175b0264f838d732d153ce63104943f 100644 (file)
@@ -5948,14 +5948,11 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd,
                               struct bfd_link_info *info,
                               asection **sinterpptr)
 {
-  size_t soname_indx;
   bfd *dynobj;
   const struct elf_backend_data *bed;
 
   *sinterpptr = NULL;
 
-  soname_indx = (size_t) -1;
-
   if (!is_elf_hash_table (info->hash))
     return TRUE;
 
@@ -5970,6 +5967,7 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd,
       struct elf_info_failed eif;
       bfd_boolean all_defined;
       asection *s;
+      size_t soname_indx;
 
       eif.info = info;
       eif.failed = FALSE;
@@ -5986,6 +5984,17 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd,
            return FALSE;
        }
 
+      if (soname != NULL)
+       {
+         soname_indx = _bfd_elf_strtab_add (elf_hash_table (info)->dynstr,
+                                            soname, TRUE);
+         if (soname_indx == (size_t) -1
+             || !_bfd_elf_add_dynamic_entry (info, DT_SONAME, soname_indx))
+           return FALSE;
+       }
+      else
+       soname_indx = (size_t) -1;
+
       /* Make all global versions with definition.  */
       for (t = info->version_info; t != NULL; t = t->next)
        for (d = t->globals.list; d != NULL; d = d->next)
@@ -6494,15 +6503,6 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd,
       *sinterpptr = bfd_get_linker_section (dynobj, ".interp");
       BFD_ASSERT (*sinterpptr != NULL || !bfd_link_executable (info) || info->nointerp);
 
-      if (soname != NULL)
-       {
-         soname_indx = _bfd_elf_strtab_add (elf_hash_table (info)->dynstr,
-                                            soname, TRUE);
-         if (soname_indx == (size_t) -1
-             || !_bfd_elf_add_dynamic_entry (info, DT_SONAME, soname_indx))
-           return FALSE;
-       }
-
       if (info->symbolic)
        {
          if (!_bfd_elf_add_dynamic_entry (info, DT_SYMBOLIC, 0))
index 793847d96fdfe36e653b0eee49c38405233cc007..a5732a555ae1e2cbdc6c3d253037954a028cc6a5 100644 (file)
@@ -1,3 +1,12 @@
+2017-04-17  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/21389
+       * testsuite/ld-elf/pr21389.map: New file.
+       * testsuite/ld-elf/pr21389.s: Likewise.
+       * testsuite/ld-elf/pr21389a.d: Likewise.
+       * testsuite/ld-elf/pr21389b.d: Likewise.
+       * testsuite/ld-elf/pr21389c.d: Likewise.
+
 2017-04-17  Alan Modra  <amodra@gmail.com>
 
        * testsuite/ld-elf/indirect5a.c,
diff --git a/ld/testsuite/ld-elf/pr21389.map b/ld/testsuite/ld-elf/pr21389.map
new file mode 100644 (file)
index 0000000..88c8c28
--- /dev/null
@@ -0,0 +1,6 @@
+FOO {
+global:
+  foo;
+local:
+  *;
+};
diff --git a/ld/testsuite/ld-elf/pr21389.s b/ld/testsuite/ld-elf/pr21389.s
new file mode 100644 (file)
index 0000000..a943cc6
--- /dev/null
@@ -0,0 +1,5 @@
+       .globl foo
+       .type foo,%object
+       .data
+foo:
+       .long   0
diff --git a/ld/testsuite/ld-elf/pr21389a.d b/ld/testsuite/ld-elf/pr21389a.d
new file mode 100644 (file)
index 0000000..2dcd175
--- /dev/null
@@ -0,0 +1,10 @@
+#source: pr21389.s
+#ld: -shared --version-script pr21389.map -soname=pr21389.so
+#objdump: -p
+#target: *-*-linux* *-*-gnu*
+
+#...
+Version definitions:
+1 0x01 0x[0-9a-f]* pr21389.so
+2 0x00 0x[0-9a-f]* FOO
+#pass
diff --git a/ld/testsuite/ld-elf/pr21389b.d b/ld/testsuite/ld-elf/pr21389b.d
new file mode 100644 (file)
index 0000000..8dbc34b
--- /dev/null
@@ -0,0 +1,8 @@
+#source: pr21389.s
+#ld: -shared --version-script pr21389.map -soname=pr21389.so
+#readelf: -d
+#target: *-*-linux* *-*-gnu*
+
+#...
+ 0x[0-9a-f]* \(SONAME\) +Library soname: \[pr21389.so\]
+#pass
diff --git a/ld/testsuite/ld-elf/pr21389c.d b/ld/testsuite/ld-elf/pr21389c.d
new file mode 100644 (file)
index 0000000..76ac37b
--- /dev/null
@@ -0,0 +1,8 @@
+#source: pr21389.s
+#ld: -shared -soname=pr21389.so
+#readelf: -d
+#target: *-*-linux* *-*-gnu*
+
+#...
+ 0x[0-9a-f]* \(SONAME\) +Library soname: \[pr21389.so\]
+#pass