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.
This commit is contained in:
Alan Modra 2021-02-18 14:43:14 +10:30
parent 0be51eb4c3
commit 2f973f134d
2 changed files with 79 additions and 72 deletions

View File

@ -1,3 +1,10 @@
2021-02-19 Alan Modra <amodra@gmail.com>
* 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 <andrew.burgess@embecosm.com>
* testplugin.c (record_read_length): Remove debug fprintf.

View File

@ -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
}