Add a setting for the dynamic loader to find the shared libgcc_s library in build-tree testing, fixing a catastrophic libgo testsuite failure in cross-compilation where the library cannot be found by the loader at run time and consequently no test case executes, producing output (here with the `x86_64-linux-gnu' host and the `riscv64-linux-gnu' target, with RISC-V QEMU in the Linux user emulation mode as the target board) like:
spawn qemu-riscv64 -E LD_LIBRARY_PATH=.:.../riscv64-linux-gnu/lib64/lp64d/libgo/.libs ./a.exe ./a.exe: error while loading shared libraries: libgcc_s.so.1: cannot open shared object file: No such file or directory FAIL: archive/tar Use the `ld_library_path' TCL variable to propagate the setting obtained from where GCC finds the library at link time, making test output look like: spawn qemu-riscv64 -E LD_LIBRARY_PATH=.:..././gcc/lib64/lp64d:.../riscv64-linux-gnu/lib64/lp64d/libgo/.libs ./a.exe PASS PASS: archive/tar No summary comparison, because the libgo testsuite does not provide one in this configuration for some reason, however this change improves overall results from 0 PASSes and 159 FAILs to 133 PASSes and 26 FAILs. gcc/testsuite/ * lib/go.exp (go_link_flags): Add `ld_library_path' setting to find shared `libgcc_s' library at run time in build-tree testing. --- Hi, Regression-tested with `make check-go' with the `x86_64-linux-gnu' native system as well as the `x86_64-linux-gnu' host and the `riscv64-linux-gnu' target, with RISC-V QEMU in the Linux user emulation mode as the target board. NB as a heads-up numerous tests fail quietly (i.e. with no FAIL report and no name of the test case given either) to link due to unsatisfied symbol references, such as: .../bin/riscv64-linux-gnu-ld: _gotest_.o: in function `cmd..z2fgo..z2finternal..z2fcache.Cache.get': .../riscv64-linux-gnu/libgo/gotest24771/test/cache.go:182: undefined reference to `cmd..z2fgo..z2finternal..z2frenameio.ReadFile' which I take is due to a reference to `libgotool.a' -- which is where the required symbols are defined -- missing from the linker invocation. I don't know what's supposed to supply the library to the linker or whether this indeed the actual cause; I find the way libgo tests have been wired unusual and consequently hard to follow, so maybe someone more familiar with this stuff will be able to tell what is going on here. I'll be happy to push any patches through testing. OK to apply to GCC? Maciej --- gcc/testsuite/lib/go.exp | 8 ++++++++ 1 file changed, 8 insertions(+) gcc-test-libgo-libgcc-lib-path.diff Index: gcc/gcc/testsuite/lib/go.exp =================================================================== --- gcc.orig/gcc/testsuite/lib/go.exp +++ gcc/gcc/testsuite/lib/go.exp @@ -104,6 +104,14 @@ proc go_link_flags { paths } { verbose "shared lib extension: $shlib_ext" if { $gccpath != "" } { + set compiler [lindex $GOC_UNDER_TEST 0] + set compiler_opts [join [lrange $GOC_UNDER_TEST 1 end]] + set libgccs [remote_exec host "$compiler" \ + "$compiler_opts -print-file-name=libgcc_s.${shlib_ext}"] + if { [lindex $libgccs 0] == 0 \ + && [set libgccsdir [file dirname [lindex $libgccs 1]]] != "" } { + append ld_library_path ":${libgccsdir}" + } if [file exists "${gccpath}/libgo/libgobegin.a"] { append flags "-L${gccpath}/libgo " }