pr28348
authorMatthias Klose <doko@debian.org>
Sun, 2 Jan 2022 08:17:30 +0000 (08:17 +0000)
committerBastian Blank <waldi@debian.org>
Sun, 2 Jan 2022 08:17:30 +0000 (08:17 +0000)
Gbp-Pq: Name pr28348.diff

bfd/elflink.c
ld/testsuite/ld-elf/pr28348.rd [new file with mode: 0644]
ld/testsuite/ld-elf/pr28348.t [new file with mode: 0644]
ld/testsuite/ld-elf/pr28348a.c [new file with mode: 0644]
ld/testsuite/ld-elf/pr28348b.c [new file with mode: 0644]
ld/testsuite/ld-elf/pr28348c.c [new file with mode: 0644]
ld/testsuite/ld-elf/shared.exp

index 9a05208253c228f72d11b22401c002237d960e31..c58e6cc05b253008e5d7af26e23abc01ce6b0f7f 100644 (file)
@@ -4948,7 +4948,8 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
                 || h->root.type == bfd_link_hash_warning)
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
 
-         if (elf_tdata (abfd)->verdef != NULL
+         if (h->versioned != unversioned
+             && elf_tdata (abfd)->verdef != NULL
              && vernum > 1
              && definition)
            h->verinfo.verdef = &elf_tdata (abfd)->verdef[vernum - 1];
diff --git a/ld/testsuite/ld-elf/pr28348.rd b/ld/testsuite/ld-elf/pr28348.rd
new file mode 100644 (file)
index 0000000..6e6ac04
--- /dev/null
@@ -0,0 +1,8 @@
+#ld: -shared
+#readelf: --dyn-syms --wide
+#target: *-*-linux* *-*-gnu* arm*-*-uclinuxfdpiceabi
+#xfail: ![check_shared_lib_support]
+
+#...
+ +[0-9]+: +[0-9a-f]+ +[0-9a-f]+ +FUNC +WEAK +DEFAULT (\[NOPV\]|) +[0-9]+ +_?foo
+#pass
diff --git a/ld/testsuite/ld-elf/pr28348.t b/ld/testsuite/ld-elf/pr28348.t
new file mode 100644 (file)
index 0000000..89ea6ef
--- /dev/null
@@ -0,0 +1,6 @@
+VERS_2.0 {
+global:
+  foo; bar;
+local:
+  *;
+};
diff --git a/ld/testsuite/ld-elf/pr28348a.c b/ld/testsuite/ld-elf/pr28348a.c
new file mode 100644 (file)
index 0000000..3d54205
--- /dev/null
@@ -0,0 +1,5 @@
+__attribute__ ((weak))
+void
+foo (void)
+{
+}
diff --git a/ld/testsuite/ld-elf/pr28348b.c b/ld/testsuite/ld-elf/pr28348b.c
new file mode 100644 (file)
index 0000000..b4aab59
--- /dev/null
@@ -0,0 +1,5 @@
+void
+foo (void)
+{
+}
+asm (".symver foo,foo@VERS_2.0");
diff --git a/ld/testsuite/ld-elf/pr28348c.c b/ld/testsuite/ld-elf/pr28348c.c
new file mode 100644 (file)
index 0000000..cbb9d56
--- /dev/null
@@ -0,0 +1,8 @@
+extern void foo (void);
+
+int
+main ()
+{
+  foo ();
+  return 0;
+}
index d00358e47ef595b9cdf6f87b2613f29fedbf3b99..3b8fe63dd40fe083ad3618c75636d5a64f587c87 100644 (file)
@@ -868,6 +868,45 @@ run_cc_link_tests [list \
        {} \
        "pr26590" \
     ] \
+    [list \
+       "Build libpr28348a.so" \
+       "-shared -Wl,--version-script=pr28348.t" \
+       "-fPIC" \
+       {pr28348a.c} \
+       {} \
+       "libpr28348a.so" \
+    ] \
+    [list \
+       "Build pr28348b.o" \
+       "" \
+       "-fPIC" \
+       {pr28348b.c} \
+    ] \
+    [list \
+       "Build pr28348c.o" \
+       "" \
+       "" \
+       {pr28348c.c} \
+    ] \
+    [list \
+       "Build libpr28348b.so" \
+       "-shared -Wl,--version-script=pr28348.t \
+        -Wl,--no-as-needed tmpdir/pr28348b.o tmpdir/libpr28348a.so" \
+       "-fPIC" \
+       {dummy.c} \
+       {} \
+       "libpr28348b.so" \
+    ] \
+    [list \
+       "Build pr28348" \
+       "-Wl,--no-as-needed tmpdir/pr28348c.o \
+        tmpdir/pr28348a.o tmpdir/libpr28348a.so tmpdir/libpr28348b.so \
+        tmpdir/libpr28348a.so" \
+       "" \
+       {dummy.c} \
+       {{readelf {--dyn-syms --wide} pr28348.rd}} \
+       "pr28348" \
+    ] \
 ]
 
 # pr19073.s uses .set, which has a different meaning on alpha.