From 2f973f134d7752cbc662ec65da8ad8bbe4c6fb8f Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 18 Feb 2021 14:43:14 +1030 Subject: [PATCH] Wrong ELF class plugin vs. gcc ld version When building 32-bit binutils with CC="gcc -m32" CXX="g++ -m32" we can fail the gcc ld version test due to an error attempting to load a 64-bit plugin into 32-bit ld-new. This results in bogus errors about "Your compiler driver ignores -B when choosing ld." * testsuite/lib/ld-lib.exp: Whitespace. (load_common_lib): Expand single use and delete this proc. (run_host_cmd): Use -fno-lto when getting gcc's ld version. Use -B for clang too. --- ld/ChangeLog | 7 ++ ld/testsuite/lib/ld-lib.exp | 144 ++++++++++++++++++------------------ 2 files changed, 79 insertions(+), 72 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index b7c7bbb156a..9d16c305200 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2021-02-19 Alan Modra + + * testsuite/lib/ld-lib.exp: Whitespace. + (load_common_lib): Expand single use and delete this proc. + (run_host_cmd): Use -fno-lto when getting gcc's ld version. + Use -B for clang too. + 2021-02-18 Andrew Burgess * testplugin.c (record_read_length): Remove debug fprintf. diff --git a/ld/testsuite/lib/ld-lib.exp b/ld/testsuite/lib/ld-lib.exp index 4a08617bb31..9febe283b93 100644 --- a/ld/testsuite/lib/ld-lib.exp +++ b/ld/testsuite/lib/ld-lib.exp @@ -18,12 +18,7 @@ # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, # MA 02110-1301, USA. -proc load_common_lib { name } { - global srcdir - load_file $srcdir/../../binutils/testsuite/lib/$name -} - -load_common_lib binutils-common.exp +load_file $srcdir/../../binutils/testsuite/lib/binutils-common.exp # Returns 1 if the gcc for the target is at least version MAJOR.MINOR # Returns 0 otherwise. @@ -108,19 +103,24 @@ proc run_host_cmd { prog command } { set prog $gccexe } set gccexe [string replace $gccexe 0 [string last "/" $gccexe] ""] - if {[string match "*cc*" $gccexe] || [string match "*++*" $gccexe]} then { + if {[string match "*cc*" $gccexe] || + [string match "*++*" $gccexe] || + [string match "clang*" $gccexe]} then { set gccflags "$gcc_B_opt $gccflags $ld_L_opt" if {![info exists gcc_ld_B_opt_tested]} { set gcc_ld_B_opt_tested 1 set ld_version_message [run_host_cmd "$ld" "--version"] - set gcc_ld_version_message [run_host_cmd "$prog" "$gccflags -Wl,--version"] + set ver "-Wl,--version" + if [check_lto_available] { + set ver "-fno-lto $ver" + } + set gcc_ld_version_message [run_host_cmd "$prog" "$gccflags $ver"] if {[string first $ld_version_message $gcc_ld_version_message] < 0} { perror "************************************************************************" perror "Your compiler driver ignores -B when choosing ld." perror "You will not be testing the new ld in many of the following tests." set gcc_ld_version [run_host_cmd "$prog" "$gccflags --print-prog-name=ld"] if {![string match "" $gcc_ld_version] && ![string match "ld" $gcc_ld_version]} { - perror "It seems you will be testing $gcc_ld_version instead." } perror "************************************************************************" @@ -175,13 +175,13 @@ proc default_ld_relocate { ld target objects } { proc is_endian_output_format { object_flags } { if {[string match "*-oformat binary*" $object_flags] || \ - [string match "*-oformat ieee*" $object_flags] || \ - [string match "*-oformat ihex*" $object_flags] || \ + [string match "*-oformat ieee*" $object_flags] || \ + [string match "*-oformat ihex*" $object_flags] || \ [string match "*-oformat netbsd-core*" $object_flags] || \ - [string match "*-oformat srec*" $object_flags] || \ + [string match "*-oformat srec*" $object_flags] || \ [string match "*-oformat tekhex*" $object_flags] || \ [string match "*-oformat trad-core*" $object_flags] } then { - return 0 + return 0 } else { return 1 } @@ -254,7 +254,7 @@ proc default_ld_compile { cc source object } { } if [board_info [target_info name] exists cflags] { - append flags " [board_info [target_info name] cflags]" + append flags " [board_info [target_info name] cflags]" } if [board_info [target_info name] exists multilib_flags] { @@ -355,7 +355,7 @@ proc default_ld_nm { nm nmflags object } { while { [gets $file line] != -1 } { verbose "$line" 2 if [regexp "^(\[0-9a-fA-F\]+) \[a-zA-Z0-9\] \\.*(.+)$" $line whole value name] { - set name [string trimleft $name "_"] + set name [string trimleft $name "_"] verbose "Setting nm_output($name) to 0x$value" 2 set nm_output($name) 0x$value } @@ -376,12 +376,12 @@ proc ld_link_defsyms {} { # ARM targets call __gccmain if {[istarget arm*-*-*]} { - append flags " --defsym __gccmain=0" + append flags " --defsym __gccmain=0" } # Windows targets need __main, some prefixed with underscore. if {[istarget *-*-cygwin* ] || [istarget *-*-mingw*]} { - append flags " --defsym __main=main --defsym ___main=main" + append flags " --defsym __main=main --defsym ___main=main" } # PowerPC EABI code calls __eabi. @@ -579,13 +579,13 @@ proc run_ld_link_tests { ldtests args } { set dump_prog "" switch -- $action { objdump - { set dump_prog $objdump } + { set dump_prog $objdump } nm - { set dump_prog $nm } + { set dump_prog $nm } readelf - { set dump_prog $READELF } + { set dump_prog $READELF } ld - { set dump_prog "ld" } + { set dump_prog "ld" } default { perror "Unrecognized action $action" @@ -615,12 +615,12 @@ proc run_ld_link_tests { ldtests args } { } set env(LC_ALL) "C" set cmd "$binary $progopts $binfile" - set status [remote_exec host [concat sh -c [list "$cmd >dump.out 2>ld.stderr"]] "" "/dev/null"] + set status [remote_exec host [concat sh -c [list "$cmd >dump.out 2>ld.stderr"]] "" "/dev/null"] send_log "$cmd\n" - remote_upload host "ld.stderr" - set comp_output [prune_warnings [file_contents "ld.stderr"]] - remote_file host delete "ld.stderr" - remote_file build delete "ld.stderr" + remote_upload host "ld.stderr" + set comp_output [prune_warnings [file_contents "ld.stderr"]] + remote_file host delete "ld.stderr" + remote_file build delete "ld.stderr" if {[info exists old_lc_all]} { set env(LC_ALL) $old_lc_all @@ -639,8 +639,8 @@ proc run_ld_link_tests { ldtests args } { if { [regexp_diff "dump.out" "$srcdir/$subdir/$dumpfile"] } then { verbose "output is [file_contents "dump.out"]" 2 set failed 1 - remote_file build delete "dump.out" - remote_file host delete "dump.out" + remote_file build delete "dump.out" + remote_file host delete "dump.out" break } remote_file build delete "dump.out" @@ -693,7 +693,7 @@ proc run_ld_link_exec_tests { ldtests args } { # linker options are included in GCC spec files then we need the -specs # option. if [board_info [target_info name] exists cflags] { - set board_cflags " [board_info [target_info name] cflags]" + set board_cflags " [board_info [target_info name] cflags]" } else { set board_cflags "" } @@ -857,7 +857,7 @@ proc run_cc_link_tests { ldtests } { global STATIC_LDFLAGS if [board_info [target_info name] exists cflags] { - set board_cflags " [board_info [target_info name] cflags]" + set board_cflags " [board_info [target_info name] cflags]" } else { set board_cflags "" } @@ -900,28 +900,28 @@ proc run_cc_link_tests { ldtests } { # Find actions related to error/warning processing. switch -- $action { - error - { - set check_ld(source) "regexp" - set check_ld(regexp) $progopts - set check_ld(terminal) 1 - } - warning - { - set check_ld(source) "regexp" - set check_ld(regexp) $progopts - } - error_output - { - set check_ld(source) "file" - set check_ld(file) $progopts - set check_ld(terminal) 1 - } - warning_output - { - set check_ld(source) "file" - set check_ld(file) $progopts - } + error + { + set check_ld(source) "regexp" + set check_ld(regexp) $progopts + set check_ld(terminal) 1 + } + warning + { + set check_ld(source) "regexp" + set check_ld(regexp) $progopts + } + error_output + { + set check_ld(source) "file" + set check_ld(file) $progopts + set check_ld(terminal) 1 + } + warning_output + { + set check_ld(source) "file" + set check_ld(file) $progopts + } } } @@ -988,15 +988,15 @@ proc run_cc_link_tests { ldtests } { } if { $check_ld(source) != "" } then { - if { $ld_output == "" } then { - verbose -log "Linker was expected to give error or warning" - set failed 1 - } + if { $ld_output == "" } then { + verbose -log "Linker was expected to give error or warning" + set failed 1 + } } else { - if { $ld_output != "" } then { - verbose -log "Unexpected linker warning or error" - set failed 1 - } + if { $ld_output != "" } then { + verbose -log "Unexpected linker warning or error" + set failed 1 + } } } @@ -1011,11 +1011,11 @@ proc run_cc_link_tests { ldtests } { set dump_prog "" switch -- $action { objdump - { set dump_prog $objdump } + { set dump_prog $objdump } nm - { set dump_prog $nm } + { set dump_prog $nm } readelf - { set dump_prog $READELF } + { set dump_prog $READELF } error {} warning {} error_output {} @@ -1082,7 +1082,7 @@ proc check_gc_sections_available { } { # Some targets don't support gc-sections despite whatever's # advertised by ld's options. if { [istarget alpha-*-*] - || [istarget bpf-*-*] + || [istarget bpf-*-*] || [istarget d30v-*-*] || [istarget dlx-*-*] || [istarget hppa*64-*-*] @@ -1200,7 +1200,7 @@ proc check_compiler_available { } { global CC if {![info exists compiler_available_saved]} { - if { [which $CC] == 0 } { + if { [which $CC] == 0 } { set compiler_available_saved 0 return 0 } @@ -1266,7 +1266,7 @@ proc check_lto_available { } { global CC if {![info exists lto_available_saved]} { - if { ![check_gcc_plugin_enabled] } { + if { ![check_gcc_plugin_enabled] } { set lto_available_saved 0 return 0 } @@ -1309,7 +1309,7 @@ proc check_lto_fat_available { } { global CC if {![info exists lto_fat_available_saved]} { - if { ![check_gcc_plugin_enabled] } { + if { ![check_gcc_plugin_enabled] } { set lto_fat_available_saved 0 return 0 } @@ -1352,7 +1352,7 @@ proc check_lto_shared_available { } { global CC if {![info exists lto_shared_available_saved]} { - if { ![check_gcc_plugin_enabled] } { + if { ![check_gcc_plugin_enabled] } { set lto_shared_available_saved 0 return 0 } @@ -1418,7 +1418,7 @@ proc check_ifunc_available { } { global CC if {![info exists ifunc_available_saved]} { - if { ![check_compiler_available] } { + if { ![check_compiler_available] } { set ifunc_available_saved 0 return 0 } @@ -1467,7 +1467,7 @@ proc check_ifunc_attribute_available { } { global CC if {![info exists ifunc_attribute_available_saved]} { - if { ![check_compiler_available] } { + if { ![check_compiler_available] } { set ifunc_attribute_available_saved 0 return 0 } @@ -1514,7 +1514,7 @@ proc check_libdl_available { } { global CC if {![info exists libdl_available_saved]} { - if { ![check_compiler_available] } { + if { ![check_compiler_available] } { set libdl_available_saved 0 return 0 } @@ -1550,7 +1550,7 @@ proc check_gnu2_tls_available { } { global GNU2_CFLAGS if {![info exists gnu2_tls_available_saved]} { - if { ![check_compiler_available] || "$GNU2_CFLAGS" == "" } { + if { ![check_compiler_available] || "$GNU2_CFLAGS" == "" } { set gnu2_tls_available_saved 0 return 0 } -- 2.30.2