diff options
-rw-r--r-- | bfd/ChangeLog | 10 | ||||
-rw-r--r-- | bfd/elflink.c | 4 | ||||
-rw-r--r-- | ld/ChangeLog | 17 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/indirect.exp | 24 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr19553.map | 5 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr19553a.c | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr19553b.c | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr19553b.out | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr19553c.c | 9 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr19553c.out | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr19553d.c | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr19553d.out | 1 |
12 files changed, 94 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9bd2925..0734193 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2016-02-20 H.J. Lu <hongjiu.lu@intel.com> + + Backport from master + 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-10 H.J. Lu <hongjiu.lu@intel.com> Backport from master diff --git a/bfd/elflink.c b/bfd/elflink.c index 3d37bb4..ae8d148 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -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 diff --git a/ld/ChangeLog b/ld/ChangeLog index 4d500e1..ecee00c 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,20 @@ +2016-02-20 H.J. Lu <hongjiu.lu@intel.com> + + Backport from master + 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-02-11 H.J. Lu <hongjiu.lu@intel.com> Backport from master diff --git a/ld/testsuite/ld-elf/indirect.exp b/ld/testsuite/ld-elf/indirect.exp index e8ac1ae..25845a0 100644 --- a/ld/testsuite/ld-elf/indirect.exp +++ b/ld/testsuite/ld-elf/indirect.exp @@ -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 diff --git a/ld/testsuite/ld-elf/pr19553.map b/ld/testsuite/ld-elf/pr19553.map new file mode 100644 index 0000000..f2c03ac --- /dev/null +++ b/ld/testsuite/ld-elf/pr19553.map @@ -0,0 +1,5 @@ +FOO +{ +global: + foo; +}; diff --git a/ld/testsuite/ld-elf/pr19553a.c b/ld/testsuite/ld-elf/pr19553a.c new file mode 100644 index 0000000..f1cb6b4 --- /dev/null +++ b/ld/testsuite/ld-elf/pr19553a.c @@ -0,0 +1,8 @@ +extern void foo (void); + +int +main (void) +{ + foo (); + return 0; +} diff --git a/ld/testsuite/ld-elf/pr19553b.c b/ld/testsuite/ld-elf/pr19553b.c new file mode 100644 index 0000000..0c438a2 --- /dev/null +++ b/ld/testsuite/ld-elf/pr19553b.c @@ -0,0 +1,8 @@ +#include <stdio.h> + +__attribute__ ((weak)) +void +foo (void) +{ + printf ("pr19553b\n"); +} diff --git a/ld/testsuite/ld-elf/pr19553b.out b/ld/testsuite/ld-elf/pr19553b.out new file mode 100644 index 0000000..a5575d9 --- /dev/null +++ b/ld/testsuite/ld-elf/pr19553b.out @@ -0,0 +1 @@ +pr19553b diff --git a/ld/testsuite/ld-elf/pr19553c.c b/ld/testsuite/ld-elf/pr19553c.c new file mode 100644 index 0000000..d80dfc9 --- /dev/null +++ b/ld/testsuite/ld-elf/pr19553c.c @@ -0,0 +1,9 @@ +#include <stdio.h> + +void +foo (void) +{ + printf ("pr19553c\n"); +} + +asm (".symver foo,foo@FOO"); diff --git a/ld/testsuite/ld-elf/pr19553c.out b/ld/testsuite/ld-elf/pr19553c.out new file mode 100644 index 0000000..9d23215 --- /dev/null +++ b/ld/testsuite/ld-elf/pr19553c.out @@ -0,0 +1 @@ +pr19553c diff --git a/ld/testsuite/ld-elf/pr19553d.c b/ld/testsuite/ld-elf/pr19553d.c new file mode 100644 index 0000000..d48f8f3 --- /dev/null +++ b/ld/testsuite/ld-elf/pr19553d.c @@ -0,0 +1,8 @@ +#include <stdio.h> + +__attribute__ ((weak)) +void +foo (void) +{ + printf ("pr19553d\n"); +} diff --git a/ld/testsuite/ld-elf/pr19553d.out b/ld/testsuite/ld-elf/pr19553d.out new file mode 100644 index 0000000..2b4cf0b --- /dev/null +++ b/ld/testsuite/ld-elf/pr19553d.out @@ -0,0 +1 @@ +pr19553d |