PR 17287, DT_NEEDED of unneeded libraries affects --as-needed
authorAlan Modra <amodra@gmail.com>
Mon, 18 Aug 2014 05:13:03 +0000 (14:43 +0930)
committerAlan Modra <amodra@gmail.com>
Mon, 18 Aug 2014 09:15:01 +0000 (18:45 +0930)
PR 17287
bfd/
* elflink.c (on_needed_list): Only consider libraries that have
been loaded.
ld/
* ld.texinfo (--as-needed): Clarify that references from libraries
must be from needed libraries.
ld/testsuite/
* ld-plugin/needed3.c: New file.
* ld-elf/shared.exp: Add needed3 test.

bfd/ChangeLog
bfd/elflink.c
ld/ChangeLog
ld/ld.texinfo
ld/testsuite/ChangeLog
ld/testsuite/ld-elf/needed3.c [new file with mode: 0644]
ld/testsuite/ld-elf/shared.exp

index 508a20a2a9c9aa149f08ca668b9942e60789432a..3c2ed575c85d5adefedf72d1b1c379249a24ac27 100644 (file)
@@ -1,3 +1,9 @@
+2014-08-18  Alan Modra  <amodra@gmail.com>
+
+       PR 17287
+       * elflink.c (on_needed_list): Only consider libraries that have
+       been loaded.
+
 2014-08-18  Alan Modra  <amodra@gmail.com>
 
        * elflink.c (bfd_elf_discard_info): Return int error status.
index d20f357e2cc6c1a41c48abd65eba35bcf2eddabf..c80ee8257b587e3696275a919814b651301ed172 100644 (file)
@@ -3086,7 +3086,8 @@ static bfd_boolean
 on_needed_list (const char *soname, struct bfd_link_needed_list *needed)
 {
   for (; needed != NULL; needed = needed->next)
-    if (strcmp (soname, needed->name) == 0)
+    if ((elf_dyn_lib_class (needed->by) & DYN_AS_NEEDED) == 0
+       && strcmp (soname, needed->name) == 0)
       return TRUE;
 
   return FALSE;
index 2c1ec6af9c541e59309fd8ad6ce2800d13be83d8..7804d71821afb29153829961ece0113b00ca67e5 100644 (file)
@@ -1,3 +1,8 @@
+2014-08-18  Alan Modra  <amodra@gmail.com>
+
+       * ld.texinfo (--as-needed): Clarify that references from libraries
+       must be from needed libraries.
+
 2014-08-18  Alan Modra  <amodra@gmail.com>
 
        * emultempl/aarch64elf.em (gld${EMULATION_NAME}_after_allocation):
index b559b4f5ed0cb0a2fca9724ddbcd7e43c9515a06..718a7d034575f3cf6512b428037c4e4add17a31e 100644 (file)
@@ -1179,8 +1179,8 @@ on the command line, regardless of whether the library is actually
 needed or not.  @option{--as-needed} causes a DT_NEEDED tag to only be
 emitted for a library that @emph{at that point in the link} satisfies a
 non-weak undefined symbol reference from a regular object file or, if
-the library is not found in the DT_NEEDED lists of other libraries, a
-non-weak undefined symbol reference from another dynamic library.
+the library is not found in the DT_NEEDED lists of other needed libraries, a
+non-weak undefined symbol reference from another needed dynamic library.
 Object files or libraries appearing on the command line @emph{after}
 the library in question do not affect whether the library is seen as
 needed.  This is similar to the rules for extraction of object files
index c52203af31a1ce5273db851d77ca7dd4c5dc1159..6b6e8f7ad43b75d7f81cf95ba9ca54be9614e6d2 100644 (file)
@@ -1,3 +1,8 @@
+2014-08-18  Alan Modra  <amodra@gmail.com>
+
+       * ld-plugin/needed3.c: New file.
+       * ld-elf/shared.exp: Add needed3 test.
+
 2014-08-12  Alan Modra  <amodra@gmail.com>
 
        * lib/ld-lib.exp (check_plugin_api_available): Match "-plugin PLUGIN".
diff --git a/ld/testsuite/ld-elf/needed3.c b/ld/testsuite/ld-elf/needed3.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 de2a5f292706244a89dfdceffed1d63e2aea6a5f..b55856a2462580ce3e3262e23d647c992130951f 100644 (file)
@@ -222,6 +222,18 @@ set build_tests {
   {"Build needed2"
    "tmpdir/libneeded2c.o -Wl,--as-needed tmpdir/libneeded2a.so tmpdir/libneeded2b.so" ""
    {dummy.c} {} "needed2"}
+  {"Build libneeded3a.so"
+   "-shared -Wl,--no-add-needed" "-fPIC"
+   {needed1a.c} {} "libneeded3a.so"}
+  {"Build libneeded3b.so"
+   "-shared -Wl,--no-as-needed,--add-needed -Ltmpdir -lneeded1b" "-fPIC"
+   {dummy.c} {} "libneeded3b.so"}
+  {"Build needed3.o"
+   "-r -nostdlib" ""
+   {needed3.c} {} "libneeded3.so"}
+  {"Build needed3"
+   "tmpdir/needed3.o -Wl,--as-needed -Ltmpdir -lneeded3a -lneeded3b -lneeded1b" ""
+   {dummy.c} {} "needed3"}
   {"Build libpr2404a.so"
    "-shared" "-fPIC"
    {pr2404a.c} {} "libpr2404a.so"}