aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2020-10-30 14:56:35 +1030
committerAlan Modra <amodra@gmail.com>2020-11-02 09:39:53 +1030
commitb1a92c635c1ec10fd703302ce1fc4ab3a8515a04 (patch)
tree80c9f60d71a1d360f6a223b8d3ee4c330a5af55d /ld
parentae7754b256f1f230baec364d90561c3ca34f7e64 (diff)
downloadgdb-b1a92c635c1ec10fd703302ce1fc4ab3a8515a04.zip
gdb-b1a92c635c1ec10fd703302ce1fc4ab3a8515a04.tar.gz
gdb-b1a92c635c1ec10fd703302ce1fc4ab3a8515a04.tar.bz2
PR26806, Suspected linker bug with LTO
This patch reverts most of git commit 1e3b96fd6cf, so IR symbols are again not marked def_regular or ref_regular. That should be enough to stop IR symbols from becoming dynamic. To mark as-needed shared libraries referenced by IR symbols, use the referencing BFD rather than the ref flags. bfd/ PR 15146 PR 26314 PR 26530 PR 26806 * elflink.c (elf_link_add_object_symbols): Don't set def/ref flags for plugin syms. Do allow plugin syms to mark as-needed libs. ld/ PR 26806 * testsuite/ld-plugin/lto-19.h, * testsuite/ld-plugin/lto-19a.c, * testsuite/ld-plugin/lto-19b.c, * testsuite/ld-plugin/lto-19c.c: New test. * testsuite/ld-plugin/pr26806.c, * testsuite/ld-plugin/pr26806.d: New test. * testsuite/ld-plugin/lto.exp: Run them.
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog11
-rw-r--r--ld/testsuite/ld-plugin/lto-19.h6
-rw-r--r--ld/testsuite/ld-plugin/lto-19a.c19
-rw-r--r--ld/testsuite/ld-plugin/lto-19b.c7
-rw-r--r--ld/testsuite/ld-plugin/lto-19c.c9
-rw-r--r--ld/testsuite/ld-plugin/lto.exp16
-rw-r--r--ld/testsuite/ld-plugin/pr26806.c2
-rw-r--r--ld/testsuite/ld-plugin/pr26806.d4
8 files changed, 74 insertions, 0 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 3f39eb4..f980e62 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,14 @@
+2020-11-02 Alan Modra <amodra@gmail.com>
+
+ PR 26806
+ * testsuite/ld-plugin/lto-19.h,
+ * testsuite/ld-plugin/lto-19a.c,
+ * testsuite/ld-plugin/lto-19b.c,
+ * testsuite/ld-plugin/lto-19c.c: New test.
+ * testsuite/ld-plugin/pr26806.c,
+ * testsuite/ld-plugin/pr26806.d: New test.
+ * testsuite/ld-plugin/lto.exp: Run them.
+
2020-10-30 H.J. Lu <hongjiu.lu@intel.com>
PR gas/26703
diff --git a/ld/testsuite/ld-plugin/lto-19.h b/ld/testsuite/ld-plugin/lto-19.h
new file mode 100644
index 0000000..0ca48d1
--- /dev/null
+++ b/ld/testsuite/ld-plugin/lto-19.h
@@ -0,0 +1,6 @@
+struct re_dfa_t {
+ const int *sb_char;
+};
+struct re_dfa_t *xregcomp (void);
+struct re_dfa_t *rpl_regcomp (void);
+void rpl_regfree (struct re_dfa_t *);
diff --git a/ld/testsuite/ld-plugin/lto-19a.c b/ld/testsuite/ld-plugin/lto-19a.c
new file mode 100644
index 0000000..6213f79
--- /dev/null
+++ b/ld/testsuite/ld-plugin/lto-19a.c
@@ -0,0 +1,19 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "lto-19.h"
+
+static const int utf8_sb_map[4] = { 0x12, 0x34, 0x56, 0x78 };
+
+struct re_dfa_t *
+rpl_regcomp ()
+{
+ struct re_dfa_t *dfa = malloc (sizeof (struct re_dfa_t));
+ dfa->sb_char = utf8_sb_map;
+ return dfa;
+}
+
+void
+rpl_regfree (struct re_dfa_t *dfa)
+{
+ puts (dfa->sb_char == utf8_sb_map ? "PASS" : "FAIL");
+}
diff --git a/ld/testsuite/ld-plugin/lto-19b.c b/ld/testsuite/ld-plugin/lto-19b.c
new file mode 100644
index 0000000..b784f84
--- /dev/null
+++ b/ld/testsuite/ld-plugin/lto-19b.c
@@ -0,0 +1,7 @@
+#include "lto-19.h"
+
+struct re_dfa_t *
+xregcomp (void)
+{
+ return rpl_regcomp ();
+}
diff --git a/ld/testsuite/ld-plugin/lto-19c.c b/ld/testsuite/ld-plugin/lto-19c.c
new file mode 100644
index 0000000..0d231ba
--- /dev/null
+++ b/ld/testsuite/ld-plugin/lto-19c.c
@@ -0,0 +1,9 @@
+#include "lto-19.h"
+
+int
+main ()
+{
+ struct re_dfa_t *dfa = xregcomp ();
+ rpl_regfree (dfa);
+ return 0;
+}
diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp
index 9f9f2d1..23c948c 100644
--- a/ld/testsuite/ld-plugin/lto.exp
+++ b/ld/testsuite/ld-plugin/lto.exp
@@ -403,6 +403,18 @@ set lto_link_elf_tests [list \
[list {lto-18d.o} \
{} {-flto -O2} \
{lto-18d.c} {} {}] \
+ [list {liblto-19.a} \
+ "$plug_opt" {-flto -O2 -fPIC} \
+ {lto-19a.c} {} {liblto-19.a}] \
+ [list {compile lto-19b.c} \
+ "$plug_opt" {-flto -O2 -fPIC} \
+ {lto-19b.c} {} {} {c}] \
+ [list {liblto-19.so} \
+ {-shared tmpdir/lto-19b.o tmpdir/liblto-19.a} {-O2 -fPIC} \
+ {dummy.c} {} {liblto-19.so}] \
+ [list {pr26806.so} \
+ {-shared} {-fpic -O2 -flto} \
+ {pr26806.c} {{nm {-D} pr26806.d}} {pr26806.so}] \
]
# PR 14918 checks that libgcc is not spuriously included in a shared link of
@@ -584,6 +596,10 @@ set lto_run_elf_shared_tests [list \
{-static -flto -fuse-linker-plugin} {} \
{lto-18a.c} {lto-18-4.exe} {lto-18.out} {-flto -O2} {c} {} \
{ -Ltmpdir -llto-18b -llto-18c tmpdir/lto-18d.o}] \
+ [list {lto-19} \
+ {-Wl,--as-needed,-R,tmpdir} {} \
+ {lto-19c.c} {lto-19.exe} {pass.out} {-flto -O2} {c} {} \
+ {tmpdir/liblto-19.so tmpdir/liblto-19.a}] \
]
# LTO run-time tests for ELF
diff --git a/ld/testsuite/ld-plugin/pr26806.c b/ld/testsuite/ld-plugin/pr26806.c
new file mode 100644
index 0000000..8bb2931
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr26806.c
@@ -0,0 +1,2 @@
+#include <unistd.h>
+int foo (int x) { if (__builtin_constant_p (x)) return getpid (); return 0; }
diff --git a/ld/testsuite/ld-plugin/pr26806.d b/ld/testsuite/ld-plugin/pr26806.d
new file mode 100644
index 0000000..16fa828
--- /dev/null
+++ b/ld/testsuite/ld-plugin/pr26806.d
@@ -0,0 +1,4 @@
+#failif
+#...
+.* _*getpid[@ ].*
+#...