diff options
-rw-r--r-- | bfd/ChangeLog | 7 | ||||
-rw-r--r-- | bfd/elflink.c | 9 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-gc/dummy.s | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-gc/gc.exp | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-gc/pr11218-1.c | 5 | ||||
-rw-r--r-- | ld/testsuite/ld-gc/pr11218-2.c | 13 | ||||
-rw-r--r-- | ld/testsuite/ld-gc/pr11218.d | 5 |
8 files changed, 53 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index c9c2d3a..75118cb 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2010-01-26 Alan Modra <amodra@gmail.com> + H.J. Lu <hongjiu.lu@intel.com> + + PR ld/11218 + * elflink.c (elf_link_output_extsym): Do not ignore undefined + symbols with ref_regular set when gc_sections is active. + 2010-01-25 Alan Modra <amodra@gmail.com> PR ld/11217 diff --git a/bfd/elflink.c b/bfd/elflink.c index 6576252..cca2d53 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -8579,7 +8579,9 @@ elf_link_output_extsym (struct elf_link_hash_entry *h, void *data) { /* If we have an undefined symbol reference here then it must have come from a shared library that is being linked in. (Undefined - references in regular files have already been handled). */ + references in regular files have already been handled unless + they are in unreferenced sections which are removed by garbage + collection). */ bfd_boolean ignore_undef = FALSE; /* Some symbols may be special in that the fact that they're @@ -8590,12 +8592,13 @@ elf_link_output_extsym (struct elf_link_hash_entry *h, void *data) /* If we are reporting errors for this situation then do so now. */ if (ignore_undef == FALSE && h->ref_dynamic - && ! h->ref_regular + && (!h->ref_regular || finfo->info->gc_sections) && ! elf_link_check_versioned_symbol (finfo->info, bed, h) && finfo->info->unresolved_syms_in_shared_libs != RM_IGNORE) { if (! (finfo->info->callbacks->undefined_symbol - (finfo->info, h->root.root.string, h->root.u.undef.abfd, + (finfo->info, h->root.root.string, + h->ref_regular ? NULL : h->root.u.undef.abfd, NULL, 0, finfo->info->unresolved_syms_in_shared_libs == RM_GENERATE_ERROR))) { eoinfo->failed = TRUE; diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 3a2dc34..224aa93 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2010-01-26 H.J. Lu <hongjiu.lu@intel.com> + + PR ld/11218 + * ld-gc/dummy.s: New. + * ld-gc/pr11218-1.c: Likewise. + * ld-gc/pr11218-2.c: Likewise. + * ld-gc/pr11218.d: Likewise. + 2010-01-23 Richard Sandiford <r.sandiford@uk.ibm.com> * ld-powerpc/aix-ref-1-32.od, ld-powerpc/aix-ref-1-64.od, diff --git a/ld/testsuite/ld-gc/dummy.s b/ld/testsuite/ld-gc/dummy.s new file mode 100644 index 0000000..403f980 --- /dev/null +++ b/ld/testsuite/ld-gc/dummy.s @@ -0,0 +1 @@ +# Dummy diff --git a/ld/testsuite/ld-gc/gc.exp b/ld/testsuite/ld-gc/gc.exp index c271a3d..7005442 100644 --- a/ld/testsuite/ld-gc/gc.exp +++ b/ld/testsuite/ld-gc/gc.exp @@ -92,3 +92,11 @@ test_gc "Check --gc-section/-r/-u" "gcrel" $ld "-r --gc-sections -u used_func" run_dump_test "noent" run_dump_test "abi-note" run_dump_test "start" +if { [is_remote host] || [which $CC] != 0 } { + if { [istarget "*-*-linux*"] } { + ld_compile "$CC -fPIC $CFLAGS $cflags" $srcdir/$subdir/pr11218-1.c tmpdir/pr11218-1.o + ld_simple_link $ld tmpdir/pr11218-1.so "-shared tmpdir/pr11218-1.o" + ld_compile "$CC -c $CFLAGS $cflags" $srcdir/$subdir/pr11218-2.c tmpdir/pr11218-2.o + run_dump_test "pr11218" + } +} diff --git a/ld/testsuite/ld-gc/pr11218-1.c b/ld/testsuite/ld-gc/pr11218-1.c new file mode 100644 index 0000000..9cc79f0 --- /dev/null +++ b/ld/testsuite/ld-gc/pr11218-1.c @@ -0,0 +1,5 @@ +extern void unresolved_detected_at_runtime_not_at_linktime(void); +void foo_in_so(void) +{ + unresolved_detected_at_runtime_not_at_linktime(); +} diff --git a/ld/testsuite/ld-gc/pr11218-2.c b/ld/testsuite/ld-gc/pr11218-2.c new file mode 100644 index 0000000..2515bc6 --- /dev/null +++ b/ld/testsuite/ld-gc/pr11218-2.c @@ -0,0 +1,13 @@ +extern void foo_in_so(void); + +void call_unresolved(void) +{ + unresolved_detected_at_runtime_not_at_linktime(); +} + +int main(int argc, char *argv[]) +{ + foo_in_so(); + + return 0; +} diff --git a/ld/testsuite/ld-gc/pr11218.d b/ld/testsuite/ld-gc/pr11218.d new file mode 100644 index 0000000..27019a8 --- /dev/null +++ b/ld/testsuite/ld-gc/pr11218.d @@ -0,0 +1,5 @@ +# name: --gc-sections with shared library +# source: dummy.s +# ld: --gc-sections -e main tmpdir/pr11218-2.o tmpdir/pr11218-1.so +# target: *-*-linux* +# error: undefined reference to `unresolved_detected_at_runtime_not_at_linktime' |