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]

Re: php5: probably binutils bug


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


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