This is the mail archive of the 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]

PR 17287, DT_NEEDED of unneeded libraries affects --as-needed

Committed.  htab->needed has entries added to it before we decide an
--as-needed library is going to be needed.  Clearly those that aren't
needed shouldn't affect later linker decisions.

	PR 17287
	* elflink.c (on_needed_list): Only consider libraries that have
	been loaded.
	* ld.texinfo (--as-needed): Clarify that references from libraries
	must be from needed libraries.
	* ld-plugin/needed3.c: New file.
	* ld-elf/shared.exp: Add needed3 test.

diff --git a/bfd/elflink.c b/bfd/elflink.c
index d20f357..c80ee82 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -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;
diff --git a/ld/ld.texinfo b/ld/ld.texinfo
index b559b4f..718a7d0 100644
--- a/ld/ld.texinfo
+++ b/ld/ld.texinfo
@@ -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
diff --git a/ld/testsuite/ld-elf/needed3.c b/ld/testsuite/ld-elf/needed3.c
new file mode 100644
index 0000000..cbb9d56
--- /dev/null
+++ b/ld/testsuite/ld-elf/needed3.c
@@ -0,0 +1,8 @@
+extern void foo (void);
+main ()
+  foo ();
+  return 0;
diff --git a/ld/testsuite/ld-elf/shared.exp b/ld/testsuite/ld-elf/shared.exp
index de2a5f2..b55856a 100644
--- a/ld/testsuite/ld-elf/shared.exp
+++ b/ld/testsuite/ld-elf/shared.exp
@@ -222,6 +222,18 @@ set build_tests {
   {"Build needed2"
    "tmpdir/libneeded2c.o -Wl,--as-needed tmpdir/ tmpdir/" ""
    {dummy.c} {} "needed2"}
+  {"Build"
+   "-shared -Wl,--no-add-needed" "-fPIC"
+   {needed1a.c} {} ""}
+  {"Build"
+   "-shared -Wl,--no-as-needed,--add-needed -Ltmpdir -lneeded1b" "-fPIC"
+   {dummy.c} {} ""}
+  {"Build needed3.o"
+   "-r -nostdlib" ""
+   {needed3.c} {} ""}
+  {"Build needed3"
+   "tmpdir/needed3.o -Wl,--as-needed -Ltmpdir -lneeded3a -lneeded3b -lneeded1b" ""
+   {dummy.c} {} "needed3"}
    "-shared" "-fPIC"
    {pr2404a.c} {} ""}

Alan Modra
Australia Development Lab, IBM

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