This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH, binutils] Fix implib test failures
- From: Thomas Preudhomme <thomas dot preudhomme at foss dot arm dot com>
- To: amodra at gmail dot com, nickc at redhat dot com, binutils at sourceware dot org
- Date: Tue, 19 Jul 2016 15:08:51 +0100
- Subject: [PATCH, binutils] Fix implib test failures
- Authentication-results: sourceware.org; auth=none
Hi,
The tests added for the ELF import library feature (commit
76359541825cf36ecd14ab6b5974ee56e1c59eff) fail on most targets for various
reasons:
(1) use of non generic .bss directive
(2) varying number of spaces in output between targets
(3) restriction on where a section can start due to default linker scripts
(4) code for the feature segfault when dealing with local symbols
(5) assert failure in swap_out_syms when ELF output section cannot be found
This patch aims at fixing all these issues by:
(a) using equivalent .section target independent directive instead of .bss
(fixes (1))
(b) making regex matching more flexible and not setting a specific .data start
address (fixes (2) and (3))
(c) skipping local symbols when filtering symbols to output in import library
(fixes (4))
(d) errorring out instead of using an assert when ELF output section cannot be
found (fixes (5)).
Many thanks to Alan Modra and Nick Clifton for spotting the issues and
providing with fixes.
ChangeLog entries are as follow:
*** bfd/ChangeLog ***
2016-07-18 Nick Clifton <nickc@redhat.com>
* elf.c (_bfd_elf_filter_global_symbols): Skip local symbols.
(swap_out_syms): Error out when not finding ELF output section instead
of asserting we find one.
* elflink.c (elf_output_implib): Call bfd_set_error before displaying
error message.
*** ld/ChangeLog ***
2016-07-18 Alan Modra <amodra@gmail.com>
Thomas Preud'homme <thomas.preudhomme@arm.com>
* testsuite/ld-elf/elf.exp: Xfail targets using
_bfd_generic_final_link instead of bfd_elf_final_link when running
import library tests.
(Generate import library): Stop setting .data section start address.
* testsuite/ld-elf/implib.s: Remove first .bss directive and replace
second one with equivalent .section directive.
* testsuite/ld-elf/implib.rd: Escape dot in filename, stop testing
addresses of symbols and be more flexible on the number of spaces in
output.
The changes have been tested on arm-none-eabi, i386-linux-gnu, x86_64-linux-
gnu, avr-elf, bfin-elf, mipstx39-elf and d30v-elf. They pass successfully on
all these targets except on d30v-elf where they xfail as expected (target does
not use bfd_elf_final_link).
Is this ok for trunk?
Best regards,
Thomas
diff --git a/bfd/elf.c b/bfd/elf.c
index ebcf40a92578b588c19312b1e4e521fff8ddad14..2d5f69c5f4392cf4dec73edd4e95a5260d2db239 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;
@@ -7641,7 +7642,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'"),
@@ -7650,9 +7653,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 a994b839f9c152b276912ee0b596eda822bd2acc..5bc57408e47056d8c393f7247ab6312927c598cc 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/testsuite/ld-elf/elf.exp b/ld/testsuite/ld-elf/elf.exp
index 832f313c5b4f290a37df83d5e5dfcd4c3e624cb0..1b8d203ce6e84ade5472d7a0f9bacbf05156f0b2 100644
--- a/ld/testsuite/ld-elf/elf.exp
+++ b/ld/testsuite/ld-elf/elf.exp
@@ -136,6 +136,10 @@ foreach t $test_list {
run_dump_test [file rootname $t]
}
+# These targets use bfd_elf_final_link rather than bfd_generic_final_link
+# and thus do not have support for ELF import library
+setup_xfail "am33lin-*-*" "d30v-*-*" "dlx-*-*" "i960-*-*" "m68hc1x-*-*"
+setup_xfail "m88k-*-*" "pj-*-*" "score7-*-*" "sh64-*-*" "vxworks-*-*"
# Check that the --out-implib option work correctly.
run_ld_link_tests {
{"Generate empty import library"
@@ -145,7 +149,7 @@ run_ld_link_tests {
{{ld empty-implib.out}}
"implib"}
{"Generate import library"
- "-Tdata=0x1000 --out-implib=tmpdir/implib.lib" ""
+ "--out-implib=tmpdir/implib.lib" ""
""
{implib.s}
{{readelf {-s tmpdir/implib.lib} implib.rd}}
diff --git a/ld/testsuite/ld-elf/empty-implib.out b/ld/testsuite/ld-elf/empty-implib.out
index b123064df3f6f429c59fe204d57e57ed76a8d5be..cc6a9f47726c93be36b33e1b5252684b65573c84 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
+#...
diff --git a/ld/testsuite/ld-elf/implib.rd b/ld/testsuite/ld-elf/implib.rd
index 9f854a59bd26054a8fdb49f6dbaac4120b2c7ef1..41ee435ec5d14f283a3aaca97355a956e097a97f 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
+ +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 a86a940c138d7dd65e42c609adbe594c579061ac..e4d527b22939163f796b73109ee63680bd030aed 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