ld: Change indirect symbol from IR to undefined
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 26 Aug 2021 14:43:23 +0000 (07:43 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Sat, 28 Aug 2021 02:44:57 +0000 (19:44 -0700)
bfd/

PR ld/28264
* elflink.c (_bfd_elf_merge_symbol): Change indirect symbol from
IR to undefined.

ld/

PR ld/28264
* testsuite/ld-plugin/lto.exp: Run PR ld/28264 test.
* testsuite/ld-plugin/pr28264-1.d: New file.
* testsuite/ld-plugin/pr28264-2.d: Likewise.
* testsuite/ld-plugin/pr28264-3.d: Likewise.
* testsuite/ld-plugin/pr28264-4.d: Likewise.
* testsuite/ld-plugin/pr28264.c: Likewise.
* testsuite/ld-plugin/pr28264.ver: Likewise.

bfd/elflink.c
ld/testsuite/ld-plugin/lto.exp
ld/testsuite/ld-plugin/pr28264-1.d [new file with mode: 0644]
ld/testsuite/ld-plugin/pr28264-2.d [new file with mode: 0644]
ld/testsuite/ld-plugin/pr28264-3.d [new file with mode: 0644]
ld/testsuite/ld-plugin/pr28264-4.d [new file with mode: 0644]
ld/testsuite/ld-plugin/pr28264.c [new file with mode: 0644]
ld/testsuite/ld-plugin/pr28264.ver [new file with mode: 0644]

index c9d5da2dab4aef2edb35b14870d9a37fe87a44de..6fe90412b2823d5ec55460277237d90fa9039be5 100644 (file)
@@ -1272,14 +1272,25 @@ _bfd_elf_merge_symbol (bfd *abfd,
       olddyn = (oldsec->symbol->flags & BSF_DYNAMIC) != 0;
     }
 
-  /* Handle a case where plugin_notice won't be called and thus won't
-     set the non_ir_ref flags on the first pass over symbols.  */
   if (oldbfd != NULL
-      && (oldbfd->flags & BFD_PLUGIN) != (abfd->flags & BFD_PLUGIN)
-      && newdyn != olddyn)
+      && (oldbfd->flags & BFD_PLUGIN) != (abfd->flags & BFD_PLUGIN))
     {
-      h->root.non_ir_ref_dynamic = true;
-      hi->root.non_ir_ref_dynamic = true;
+      if (newdyn != olddyn)
+       {
+         /* Handle a case where plugin_notice won't be called and thus
+            won't set the non_ir_ref flags on the first pass over
+            symbols.  */
+         h->root.non_ir_ref_dynamic = true;
+         hi->root.non_ir_ref_dynamic = true;
+       }
+
+      if ((oldbfd->flags & BFD_PLUGIN) != 0
+         && hi->root.type == bfd_link_hash_indirect)
+       {
+         /* Change indirect symbol from IR to undefined.  */
+         hi->root.type = bfd_link_hash_undefined;
+         hi->root.u.undef.abfd = oldbfd;
+       }
     }
 
   /* NEWDEF and OLDDEF indicate whether the new or old symbol,
index 68d2db1caeb738888c1cba1f5c8164e6f8a3afb0..c343132c460d3a4a31fc50275e49f32a7b368f86 100644 (file)
@@ -238,6 +238,15 @@ if { [at_least_gcc_version 10 0] } {
         "-flto -fno-common $lto_no_fat" \
         {pr25355.c} \
         [list [list "nm" "$plug_opt" "pr25355.d"]]] \
+       [list "pr28264.so" \
+        "-shared -Wl,--version-script=pr28264.ver" \
+        "-flto $lto_no_fat -fPIC" \
+        {pr28264.c} \
+        {{readelf {--dyn-syms --wide} pr28264-1.d} \
+         {readelf {--dyn-syms --wide} pr28264-2.d} \
+         {readelf {--dyn-syms --wide} pr28264-3.d} \
+         {readelf {--dyn-syms --wide} pr28264-4.d}} \
+        {pr28264.so}] \
     ]]
 }
 
diff --git a/ld/testsuite/ld-plugin/pr28264-1.d b/ld/testsuite/ld-plugin/pr28264-1.d
new file mode 100644 (file)
index 0000000..5ff8969
--- /dev/null
@@ -0,0 +1,5 @@
+Symbol table '\.dynsym' contains [0-9]+ entries:
+ +Num: +Value +Size Type +Bind +Vis +Ndx Name
+#...
+ +[0-9]+: +[0-9a-f]+ +[0-9a-f]+ +FUNC +GLOBAL +DEFAULT .*[0-9]+ _?foo@VERSION.1
+#pass
diff --git a/ld/testsuite/ld-plugin/pr28264-2.d b/ld/testsuite/ld-plugin/pr28264-2.d
new file mode 100644 (file)
index 0000000..f2f629d
--- /dev/null
@@ -0,0 +1,5 @@
+Symbol table '\.dynsym' contains [0-9]+ entries:
+ +Num: +Value +Size Type +Bind +Vis +Ndx Name
+#...
+ +[0-9]+: +[0-9a-f]+ +[0-9a-f]+ +FUNC +GLOBAL +DEFAULT .*[0-9]+ _?bar@@VERSION.1
+#pass
diff --git a/ld/testsuite/ld-plugin/pr28264-3.d b/ld/testsuite/ld-plugin/pr28264-3.d
new file mode 100644 (file)
index 0000000..b6a8f1f
--- /dev/null
@@ -0,0 +1,4 @@
+#failif
+#...
+ +[0-9]+: +[0-9a-f]+ +[0-9a-f]+ +FUNC +GLOBAL +DEFAULT .*[0-9]+ _?foo
+#...
diff --git a/ld/testsuite/ld-plugin/pr28264-4.d b/ld/testsuite/ld-plugin/pr28264-4.d
new file mode 100644 (file)
index 0000000..408b853
--- /dev/null
@@ -0,0 +1,4 @@
+#failif
+#...
+ +[0-9]+: +[0-9a-f]+ +[0-9a-f]+ +FUNC +GLOBAL +DEFAULT .*[0-9]+ _?bar
+#...
diff --git a/ld/testsuite/ld-plugin/pr28264.c b/ld/testsuite/ld-plugin/pr28264.c
new file mode 100644 (file)
index 0000000..4efa934
--- /dev/null
@@ -0,0 +1,11 @@
+void
+__attribute__ ((symver ("foo@VERSION.1")))
+foo (void)
+{
+}
+
+void
+__attribute__ ((symver ("bar@@VERSION.1")))
+bar1 (void)
+{
+}
diff --git a/ld/testsuite/ld-plugin/pr28264.ver b/ld/testsuite/ld-plugin/pr28264.ver
new file mode 100644 (file)
index 0000000..1608fca
--- /dev/null
@@ -0,0 +1,8 @@
+VERSION.1
+{
+  global:
+    foo;
+    bar;
+  local:
+    *;
+};