This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] PR ld/21389: Put soname in the version definition section


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.

ld/

	PR ld/21389
	* testsuite/ld-elf/pr21389.d: New file.
	* testsuite/ld-elf/pr21389.map: Likewise.
	* testsuite/ld-elf/pr21389.s: Likewise.
---
 bfd/elflink.c                   | 20 +++++++-------------
 ld/testsuite/ld-elf/pr21389.d   |  9 +++++++++
 ld/testsuite/ld-elf/pr21389.map |  6 ++++++
 ld/testsuite/ld-elf/pr21389.s   |  5 +++++
 4 files changed, 27 insertions(+), 13 deletions(-)
 create mode 100644 ld/testsuite/ld-elf/pr21389.d
 create mode 100644 ld/testsuite/ld-elf/pr21389.map
 create mode 100644 ld/testsuite/ld-elf/pr21389.s

diff --git a/bfd/elflink.c b/bfd/elflink.c
index dfcc51e..0dc6274 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;
 
@@ -6123,8 +6120,14 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd,
 			     + sizeof (Elf_External_Verdaux));
 	    }
 
-	  if (soname_indx != (size_t) -1)
+	  if (soname != NULL)
 	    {
+	      size_t 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;
 	      _bfd_elf_strtab_addref (elf_hash_table (info)->dynstr,
 				      soname_indx);
 	      def.vd_hash = bfd_elf_hash (soname);
@@ -6467,15 +6470,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.d b/ld/testsuite/ld-elf/pr21389.d
new file mode 100644
index 0000000..404d491
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr21389.d
@@ -0,0 +1,9 @@
+#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/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
-- 
2.9.3


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]