This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: php5: probably binutils bug
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: Binutils <binutils at sourceware dot org>, Michael Matz <matz at suse dot de>
- Date: Wed, 11 Dec 2013 08:06:41 -0800
- Subject: Re: php5: probably binutils bug
- Authentication-results: sourceware.org; auth=none
- References: <alpine dot LNX dot 2 dot 00 dot 1312051717420 dot 2204 at wotan dot suse dot de> <20131208045511 dot GE17917 at bubble dot grove dot modra dot org>
On Sat, Dec 7, 2013 at 8:55 PM, Alan Modra <amodra@gmail.com> wrote:
> Michael sent me this testcase showing a linker bug, cunningly claiming
> it was a powerpc64le failure. I tried at first to shirk all
> responsibility since I didn't reproduce the problem. He wouldn't let
> that go, pointing out that I simply had to add -Wl,--as-needed. Oh
> well, let's have a look then.. Hey! It's a generic problem!
>
> Here's the testcase, showing the failure on x64_64-linux using a 2.24
> linker. It's a little nasty in that libx.so isn't linked against
> liby.so, but we do allow shared libraries to be built with undefined
> references.
>
> cat > libx.c <<EOF
> extern void pam_end (void);
> void dumpme (void)
> {
> pam_end ();
> }
> EOF
> cat > liby.c <<EOF
> extern void pam_end (void);
> void pam_end (void) {}
> EOF
> cat > appx.c <<EOF
> extern void dumpme (void);
> int main (void)
> {
> dumpme();
> return 0;
> }
> EOF
> cat > liby.ver <<EOF
> BLAFOO {
> global: pam_end;
> local: *;
> };
> EOF
> gcc -fPIC -shared -o libx.so libx.c
> gcc -fPIC -shared -o liby.so liby.c -Wl,--version-script,liby.ver
> ln -s ~/build/gas-virgin/x86_64-linux/ld/ld-new ld
> gcc -B. -o appx appx.c -L. -Wl,--as-needed -lx -ly
> ./libx.so: undefined reference to `pam_end'
> collect2: ld returned 1 exit status
>
> What's happening is that liby.so isn't being seen as needed in appx,
> because the reference in libx.so is to an unversioned symbol while
> liby.so provides a versioned symbol. Fixed as follows.
>
> * elf64-ppc.c (_bfd_elf_add_default_symbol): Set dynamic_def
> and ref_dynamic_nonweak when chaining together indirect
> symbols.
>
I checked in this patch for this fix.
--
H.J.
-
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 4526b4e..d00d170 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,13 @@
+2013-12-11 H.J. Lu <hongjiu.lu@intel.com>
+
+ * ld-elf/shared.exp (build_tests): Add libneeded2a.so,
+ libneeded2b.so, libneeded2c.o and needed2.
+
+ * ld-elf/needed2.ver: New file.
+ * ld-elf/needed2a.c: Likewise.
+ * ld-elf/needed2b.c: Likewise.
+ * ld-elf/needed2c.c: Likewise.
+
2013-12-07 Mike Frysinger <vapier@gentoo.org>
* ld-pe/aligncomm-1.c: Remove +x file mode.
diff --git a/ld/testsuite/ld-elf/needed2.ver b/ld/testsuite/ld-elf/needed2.ver
new file mode 100644
index 0000000..a68b3d9
--- /dev/null
+++ b/ld/testsuite/ld-elf/needed2.ver
@@ -0,0 +1,4 @@
+BLAFOO {
+ global: pam_end;
+ local: *;
+};
diff --git a/ld/testsuite/ld-elf/needed2a.c b/ld/testsuite/ld-elf/needed2a.c
new file mode 100644
index 0000000..538cb22
--- /dev/null
+++ b/ld/testsuite/ld-elf/needed2a.c
@@ -0,0 +1,5 @@
+extern void pam_end (void);
+void dumpme (void)
+{
+ pam_end ();
+}
diff --git a/ld/testsuite/ld-elf/needed2b.c b/ld/testsuite/ld-elf/needed2b.c
new file mode 100644
index 0000000..50c2588
--- /dev/null
+++ b/ld/testsuite/ld-elf/needed2b.c
@@ -0,0 +1,2 @@
+extern void pam_end (void);
+void pam_end (void) {}
diff --git a/ld/testsuite/ld-elf/needed2c.c b/ld/testsuite/ld-elf/needed2c.c
new file mode 100644
index 0000000..e43b0d5
--- /dev/null
+++ b/ld/testsuite/ld-elf/needed2c.c
@@ -0,0 +1,6 @@
+extern void dumpme (void);
+int main (void)
+{
+ dumpme();
+ return 0;
+}
diff --git a/ld/testsuite/ld-elf/shared.exp b/ld/testsuite/ld-elf/shared.exp
index 56c724f..3162547 100644
--- a/ld/testsuite/ld-elf/shared.exp
+++ b/ld/testsuite/ld-elf/shared.exp
@@ -206,6 +206,18 @@ set build_tests {
{"Build librel.so"
"-shared" "-fPIC"
{rel.c} {} "librel.so"}
+ {"Build libneeded2a.so"
+ "-shared" "-fPIC"
+ {needed2a.c} {} "libneeded2a.so"}
+ {"Build libneeded2b.so"
+ "-shared -Wl,--version-script,needed2.ver" "-fPIC"
+ {needed2b.c} {} "libneeded2b.so"}
+ {"Build libneeded2c.o"
+ "-r -nostdlib" ""
+ {needed2c.c} {} "libneeded2c.o"}
+ {"Build needed2"
+ "tmpdir/libneeded2c.o -Wl,--as-needed tmpdir/libneeded2a.so
tmpdir/libneeded2b.so" ""
+ {dummy.c} {} "needed2"}
}
run_cc_link_tests $build_tests