aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog6
-rw-r--r--bfd/elflink.c3
-rw-r--r--ld/ChangeLog5
-rw-r--r--ld/ld.texinfo4
-rw-r--r--ld/testsuite/ChangeLog5
-rw-r--r--ld/testsuite/ld-elf/needed3.c8
-rw-r--r--ld/testsuite/ld-elf/shared.exp12
7 files changed, 40 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 508a20a..3c2ed57 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,11 @@
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.
* stabs.c (_bfd_discard_section_stabs): Comment typo fix.
* bfd-in.h (bfd_elf_discard_info): Updata prototype.
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/ChangeLog b/ld/ChangeLog
index 2c1ec6a..7804d71 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,10 @@
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):
Handle error status from bfd_elf_discard_info.
* emultempl/armelf.em: Likewise.
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/ChangeLog b/ld/testsuite/ChangeLog
index c52203a..6b6e8f7 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -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
index 0000000..cbb9d56
--- /dev/null
+++ b/ld/testsuite/ld-elf/needed3.c
@@ -0,0 +1,8 @@
+extern void foo (void);
+
+int
+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/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"}