This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH] PR ld/21389: Put soname in the version definition section
- From: "H.J. Lu" <hongjiu dot lu at intel dot com>
- To: binutils at sourceware dot org
- Date: Fri, 14 Apr 2017 14:47:40 -0700
- Subject: Re: [PATCH] PR ld/21389: Put soname in the version definition section
- Authentication-results: sourceware.org; auth=none
- References: <20170414201951.GA15854@intel.com>
- Reply-to: "H.J. Lu" <hjl dot tools at gmail dot com>
On Fri, Apr 14, 2017 at 01:19:51PM -0700, H.J. Lu wrote:
> Get soname index before generating the version definition section.
>
> OK for master and 2.28 branch?
>
> H.J.
> ---
> bfd/
>
> PR ld/21389
> * elflink.c (bfd_elf_size_dynamic_sections): Get soname index
> before generating the version definition section.
>
Updated patch to fix missing SONAME.
H.J.
--
Get 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/elflink.c | 24 ++++++++++++------------
ld/testsuite/ld-elf/pr21389.map | 6 ++++++
ld/testsuite/ld-elf/pr21389.s | 5 +++++
ld/testsuite/ld-elf/pr21389a.d | 10 ++++++++++
ld/testsuite/ld-elf/pr21389b.d | 8 ++++++++
ld/testsuite/ld-elf/pr21389c.d | 8 ++++++++
6 files changed, 49 insertions(+), 12 deletions(-)
create mode 100644 ld/testsuite/ld-elf/pr21389.map
create mode 100644 ld/testsuite/ld-elf/pr21389.s
create mode 100644 ld/testsuite/ld-elf/pr21389a.d
create mode 100644 ld/testsuite/ld-elf/pr21389b.d
create mode 100644 ld/testsuite/ld-elf/pr21389c.d
diff --git a/bfd/elflink.c b/bfd/elflink.c
index dfcc51e..ad2e4e6 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -5921,14 +5921,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;
@@ -5943,6 +5940,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;
@@ -5959,6 +5957,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)
@@ -6467,15 +6476,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))
diff --git a/ld/testsuite/ld-elf/pr21389.map b/ld/testsuite/ld-elf/pr21389.map
new file mode 100644
index 0000000..88c8c28
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr21389.map
@@ -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
index 0000000..a943cc6
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr21389.s
@@ -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
index 0000000..2dcd175
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr21389a.d
@@ -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
index 0000000..8dbc34b
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr21389b.d
@@ -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
index 0000000..76ac37b
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr21389c.d
@@ -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
--
2.9.3