Don't add DT_NEEDED for unmatched symbol

Don't add DT_NEEDED if a symbol from a library loaded via DT_NEEDED
doesn't match the symbol referenced by regular object.

bfd/

	PR ld/19553
	* elflink.c (elf_link_add_object_symbols): Don't add DT_NEEDED
	if a symbol from a library loaded via DT_NEEDED doesn't match
	the symbol referenced by regular object.

ld/testsuite/

	PR ld/19553
	* testsuite/ld-elf/indirect.exp: Run tests for PR ld/19553.
	* testsuite/ld-elf/pr19553.map: New file.
	* testsuite/ld-elf/pr19553.map: Likewise.
	* testsuite/ld-elf/pr19553a.c: Likewise.
	* testsuite/ld-elf/pr19553b.c: Likewise.
	* testsuite/ld-elf/pr19553b.out: Likewise.
	* testsuite/ld-elf/pr19553c.c: Likewise.
	* testsuite/ld-elf/pr19553c.out: Likewise.
	* testsuite/ld-elf/pr19553d.c: Likewise.
	* testsuite/ld-elf/pr19553d.out: Likewise.
This commit is contained in:
H.J. Lu 2016-02-01 15:49:52 -08:00
parent 713cdcbf65
commit aef2898990
12 changed files with 88 additions and 2 deletions

View file

@ -1,3 +1,10 @@
2016-02-01 H.J. Lu <hongjiu.lu@intel.com>
PR ld/19553
* elflink.c (elf_link_add_object_symbols): Don't add DT_NEEDED
if a symbol from a library loaded via DT_NEEDED doesn't match
the symbol referenced by regular object.
2016-02-01 Nathaniel Smith <njs@pobox.com>
* peicode.h (pe_ILF_build_a_bfd): Create an import symbol for both

View file

@ -4562,8 +4562,10 @@ error_free_dyn:
break;
}
/* Don't add DT_NEEDED for references from the dummy bfd. */
/* Don't add DT_NEEDED for references from the dummy bfd nor
for unmatched symbol. */
if (!add_needed
&& matched
&& definition
&& ((dynsym
&& h->ref_regular_nonweak

View file

@ -1,3 +1,17 @@
2016-02-01 H.J. Lu <hongjiu.lu@intel.com>
PR ld/19553
* testsuite/ld-elf/indirect.exp: Run tests for PR ld/19553.
* testsuite/ld-elf/pr19553.map: New file.
* testsuite/ld-elf/pr19553.map: Likewise.
* testsuite/ld-elf/pr19553a.c: Likewise.
* testsuite/ld-elf/pr19553b.c: Likewise.
* testsuite/ld-elf/pr19553b.out: Likewise.
* testsuite/ld-elf/pr19553c.c: Likewise.
* testsuite/ld-elf/pr19553c.out: Likewise.
* testsuite/ld-elf/pr19553d.c: Likewise.
* testsuite/ld-elf/pr19553d.out: Likewise.
2016-01-30 H.J. Lu <hongjiu.lu@intel.com>
PR ld/19539

View file

@ -66,7 +66,11 @@ if { ![ld_compile $CC $srcdir/$subdir/indirect1a.c tmpdir/indirect1a.o]
|| ![ld_compile $CC $srcdir/$subdir/indirect4a.c tmpdir/indirect4a.o]
|| ![ld_compile $CC $srcdir/$subdir/indirect4b.c tmpdir/indirect4b.o]
|| ![ld_compile "$CC -O2 -fPIC -I../bfd" $srcdir/$subdir/pr18720a.c tmpdir/pr18720a.o]
|| ![ld_compile $CC $srcdir/$subdir/pr18720b.c tmpdir/pr18720b.o] } {
|| ![ld_compile $CC $srcdir/$subdir/pr18720b.c tmpdir/pr18720b.o]
|| ![ld_compile "$CC -fPIC" $srcdir/$subdir/pr19553d.c tmpdir/pr19553d.o]
|| ![ld_compile "$CC -fPIC" $srcdir/$subdir/pr19553c.c tmpdir/pr19553c.o]
|| ![ld_compile "$CC -fPIC" $srcdir/$subdir/pr19553b.c tmpdir/pr19553b.o]
|| ![ld_compile $CC $srcdir/$subdir/pr19553a.c tmpdir/pr19553a.o] } {
unresolved "Indirect symbol tests"
return
}
@ -87,6 +91,15 @@ set build_tests {
{"Build pr18720b1.o"
"-r -nostdlib tmpdir/pr18720b.o" ""
{dummy.c} {} "pr18720b1.o"}
{"Build libpr19553b.so"
"-shared -Wl,--version-script=pr19553.map" "-fPIC"
{pr19553b.c} {} "libpr19553b.so"}
{"Build libpr19553c.so"
"-shared -Wl,--version-script=pr19553.map" "-fPIC"
{pr19553c.c} {} "libpr19553c.so"}
{"Build libpr19553d.so"
"-shared tmpdir/libpr19553c.so" "-fPIC"
{pr19553d.c} {} "libpr19553d.so"}
}
run_cc_link_tests $build_tests
@ -155,6 +168,15 @@ set run_tests {
{"Run with libpr18720c.so 5"
"tmpdir/libpr18720c.so tmpdir/pr18720b1.o tmpdir/pr18720a.o" ""
{check-ptr-eq.c} "pr18720d" "pr18720.out"}
{"Run with libpr19553b.so"
"tmpdir/libpr19553b.so tmpdir/libpr19553d.so -rpath-link ." ""
{pr19553a.c} "pr19553b" "pr19553b.out"}
{"Run with libpr19553c.so"
"tmpdir/libpr19553c.so tmpdir/libpr19553b.so tmpdir/libpr19553d.so" ""
{pr19553a.c} "pr19553c" "pr19553c.out"}
{"Run with libpr19553d.so"
"tmpdir/libpr19553d.so tmpdir/libpr19553b.so -rpath-link ." ""
{pr19553a.c} "pr19553d" "pr19553d.out"}
}
run_ld_link_exec_tests [] $run_tests

View file

@ -0,0 +1,5 @@
FOO
{
global:
foo;
};

View file

@ -0,0 +1,8 @@
extern void foo (void);
int
main (void)
{
foo ();
return 0;
}

View file

@ -0,0 +1,8 @@
#include <stdio.h>
__attribute__ ((weak))
void
foo (void)
{
printf ("pr19553b\n");
}

View file

@ -0,0 +1 @@
pr19553b

View file

@ -0,0 +1,9 @@
#include <stdio.h>
void
foo (void)
{
printf ("pr19553c\n");
}
asm (".symver foo,foo@FOO");

View file

@ -0,0 +1 @@
pr19553c

View file

@ -0,0 +1,8 @@
#include <stdio.h>
__attribute__ ((weak))
void
foo (void)
{
printf ("pr19553d\n");
}

View file

@ -0,0 +1 @@
pr19553d