From 5df1bc570fcc5ef5257b7a044acdaeb6b95b9822 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 20 Jul 2016 15:06:49 +0930 Subject: [PATCH] Fix implib test failures bfd/ * elf.c (_bfd_elf_filter_global_symbols): Skip local symbols. (swap_out_syms): Return an error when not finding ELF output section rather than asserting. * elflink.c (elf_output_implib): Call bfd_set_error on no symbols. ld/ * testsuite/lib/ld-lib.exp (run_ld_link_tests): Add optional parameter to pass list of xfails. * testsuite/ld-elf/elf.exp: Add xfails for implib tests. Tidy implib test formatting. Don't set .data start address. * testsuite/ld-elf/implib.s: Remove first .bss directive and replace second one with equivalent .section directive. * testsuite/ld-elf/empty-implib.out: Add expected final error. * testsuite/ld-elf/implib.rd: Update. --- bfd/ChangeLog | 10 +++++++ bfd/elf.c | 10 +++---- bfd/elflink.c | 1 + ld/ChangeLog | 11 ++++++++ ld/testsuite/ld-elf/elf.exp | 41 ++++++++++++++++++++-------- ld/testsuite/ld-elf/empty-implib.out | 1 + ld/testsuite/ld-elf/implib.rd | 12 ++++---- ld/testsuite/ld-elf/implib.s | 3 +- ld/testsuite/lib/ld-lib.exp | 8 +++++- 9 files changed, 72 insertions(+), 25 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ddf29bf5e5..b145feba18 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2016-07-21 Nick Clifton + + * elf.c (_bfd_elf_filter_global_symbols): Skip local symbols. + (swap_out_syms): Return an error when not finding ELF output + section rather than asserting. + +2016-07-21 Thomas Preud'homme + + * elflink.c (elf_output_implib): Call bfd_set_error on no symbols. + 2016-07-20 John Baldwin * elf.c (elfcore_grok_freebsd_psinfo): Check for minimum note size diff --git a/bfd/elf.c b/bfd/elf.c index ba1774e7b4..274cd535fa 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -3893,9 +3893,10 @@ _bfd_elf_filter_global_symbols (bfd *abfd, struct bfd_link_info *info, continue; h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, FALSE); + if (h == NULL) + continue; if (h->type != bfd_link_hash_defined && h->type != bfd_link_hash_defweak) continue; - if (h->linker_def || h->ldscript_def) continue; @@ -7643,7 +7644,9 @@ error_return: section of a symbol to be a section that is actually in the output file. */ sec2 = bfd_get_section_by_name (abfd, sec->name); - if (sec2 == NULL) + if (sec2 != NULL) + shndx = _bfd_elf_section_from_bfd_section (abfd, sec2); + if (shndx == SHN_BAD) { _bfd_error_handler (_("\ Unable to find equivalent output section for symbol '%s' from section '%s'"), @@ -7652,9 +7655,6 @@ Unable to find equivalent output section for symbol '%s' from section '%s'"), bfd_set_error (bfd_error_invalid_operation); goto error_return; } - - shndx = _bfd_elf_section_from_bfd_section (abfd, sec2); - BFD_ASSERT (shndx != SHN_BAD); } } diff --git a/bfd/elflink.c b/bfd/elflink.c index a994b839f9..5bc57408e4 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -11091,6 +11091,7 @@ elf_output_implib (bfd *abfd, struct bfd_link_info *info) symcount = _bfd_elf_filter_global_symbols (abfd, info, sympp, symcount); if (symcount == 0) { + bfd_set_error (bfd_error_no_symbols); (*_bfd_error_handler) (_("%B: no symbol found for import library"), implib_bfd); goto free_sym_buf; diff --git a/ld/ChangeLog b/ld/ChangeLog index a2493d0daf..ad26f62015 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,14 @@ +2016-07-21 Alan Modra + + * testsuite/lib/ld-lib.exp (run_ld_link_tests): Add optional + parameter to pass list of xfails. + * testsuite/ld-elf/elf.exp: Add xfails for implib tests. Tidy + implib test formatting. Don't set .data start address. + * testsuite/ld-elf/implib.s: Remove first .bss directive and + replace second one with equivalent .section directive. + * testsuite/ld-elf/empty-implib.out: Add expected final error. + * testsuite/ld-elf/implib.rd: Update. + 2016-07-20 H.J. Lu PR ld/20376 diff --git a/ld/testsuite/ld-elf/elf.exp b/ld/testsuite/ld-elf/elf.exp index 832f313c5b..b67105fa44 100644 --- a/ld/testsuite/ld-elf/elf.exp +++ b/ld/testsuite/ld-elf/elf.exp @@ -136,21 +136,40 @@ foreach t $test_list { run_dump_test [file rootname $t] } +# Targets using the generic linker backend don't support generating +# an import library. +set xfail_implib "" +if { [istarget "d30v-*-*"] + || [istarget "dlx-*-*"] + || [istarget "fr30-*-*"] + || ([istarget "frv-*-*"] && ![istarget "frv-*-linux*"]) + || [istarget "ft32-*-*"] + || [istarget "i860-*-*"] + || [istarget "i960-*-*"] + || [istarget "iq2000-*-*"] + || [istarget "mn10200-*-*"] + || [istarget "moxie-*-*"] + || [istarget "msp430-*-*"] + || [istarget "mt-*-*"] + || [istarget "pj*-*-*"] } { + set xfail_implib "*-*-*" +} + # Check that the --out-implib option work correctly. run_ld_link_tests { {"Generate empty import library" - "--out-implib=tmpdir/implib.lib" "" - "--defsym NO_GLOBAL=1" - {implib.s} - {{ld empty-implib.out}} - "implib"} + "--out-implib=tmpdir/implib.lib" "" + "--defsym NO_GLOBAL=1" + {implib.s} + {{ld empty-implib.out}} + "implib"} {"Generate import library" - "-Tdata=0x1000 --out-implib=tmpdir/implib.lib" "" - "" - {implib.s} - {{readelf {-s tmpdir/implib.lib} implib.rd}} - "implib"} -} + "--out-implib=tmpdir/implib.lib" "" + "" + {implib.s} + {{readelf {-s tmpdir/implib.lib} implib.rd}} + "implib"} +} $xfail_implib if { [istarget *-*-linux*] || [istarget *-*-nacl*] diff --git a/ld/testsuite/ld-elf/empty-implib.out b/ld/testsuite/ld-elf/empty-implib.out index b123064df3..f611eb7791 100644 --- a/ld/testsuite/ld-elf/empty-implib.out +++ b/ld/testsuite/ld-elf/empty-implib.out @@ -1,2 +1,3 @@ .*: .*: no symbol found for import library .*: .*: failed to generate import library +.*: final link failed: No symbols diff --git a/ld/testsuite/ld-elf/implib.rd b/ld/testsuite/ld-elf/implib.rd index 9f854a59bd..6835f39a31 100644 --- a/ld/testsuite/ld-elf/implib.rd +++ b/ld/testsuite/ld-elf/implib.rd @@ -1,10 +1,10 @@ -File: tmpdir/implib.lib +File: tmpdir/implib\.lib -Symbol table '.symtab' contains 3 entries: - Num: Value +Size Type Bind Vis Ndx Name - 0: [0-9a-f]+ 0 NOTYPE LOCAL DEFAULT UND - 1: 0+100[0-3] 1 OBJECT GLOBAL DEFAULT ABS exported1 - 2: 0+100[0-3] 1 OBJECT GLOBAL DEFAULT ABS exported2 +Symbol table '\.symtab' contains 3 entries: + +Num: +Value +Size Type +Bind +Vis +Ndx Name + +0: [0-9a-f]+ +0 NOTYPE +LOCAL +DEFAULT +UND + +1: [0-9a-f]+ +1 OBJECT +GLOBAL DEFAULT +ABS exported1 + +2: [0-9a-f]+ +1 OBJECT +GLOBAL DEFAULT +ABS exported2 File: tmpdir/implib diff --git a/ld/testsuite/ld-elf/implib.s b/ld/testsuite/ld-elf/implib.s index a86a940c13..e4d527b229 100644 --- a/ld/testsuite/ld-elf/implib.s +++ b/ld/testsuite/ld-elf/implib.s @@ -1,5 +1,4 @@ .ifndef NO_GLOBAL - .bss .comm exported1,1 .data @@ -10,7 +9,7 @@ exported2: .byte 21 .endif - .bss + .section ".bss", "aw", %nobits not_exported1: .space 1 .size not_exported1, 1 diff --git a/ld/testsuite/lib/ld-lib.exp b/ld/testsuite/lib/ld-lib.exp index 62f97689ac..9cd1959fa1 100644 --- a/ld/testsuite/lib/ld-lib.exp +++ b/ld/testsuite/lib/ld-lib.exp @@ -1159,7 +1159,9 @@ proc ar_simple_create { ar aropts target objects } { # in all other cases, any output from the linker during linking is # treated as a sign of an error and FAILs the test. # -proc run_ld_link_tests { ldtests } { +# args is an optional list of target triplets to be xfailed. +# +proc run_ld_link_tests { ldtests args } { global ld global as global nm @@ -1188,6 +1190,10 @@ proc run_ld_link_tests { ldtests } { continue } + foreach target $args { + setup_xfail $target + } + set ld_options [lindex $testitem 1] set ld_after [lindex $testitem 2] set as_options [lindex $testitem 3] -- 2.34.1