Subject: bug#69394: cross-gcc-toolchain for riscv64 doesn't search crt1.o properly

From: Ekaitz Zarraga <[email-masked]>
Date: Sun, 25 Feb 2024 21:07:17 +0100

Hi,

I made this package:

```
(define-module (cross)
   #:use-module (guix packages)
   #:use-module (guix gexp)
   #:use-module (gnu packages cross-base))

(define-public gcc-cross-riscv64-linux-gnu-toolchain
                (cross-gcc-toolchain "riscv64-linux-gnu"))
```

And used in in the session you can read in the bottom of this email.

During the session, the `crt1.o` file is not found, and the 
`riscv64-linux-gnu-gcc -v whatever.c` call shows `crt1.o` is passed to 
the compiler using only the name, while in `gcc-toolchain` it's passed 
using the full path to the libc.

This looks like the `cross-gcc-toolchain` is missing some configuration 
for proper usage in a guix shell.

Best,
Ekaitz

The session I that explains the behavior:

```
# Using gcc-toolchain here `crt1.o` is found:
Ekaitz@tuxedo ~/projects/nlnet/gzip-1.2.4$ guix shell gcc-toolchain
Ekaitz@tuxedo ~/projects/nlnet/gzip-1.2.4 [env]$ gcc -v deflate.c
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/gnu/store/vjjk375kysja1jz0837lypd09rdgs47c-gcc-13.2.0/libexec/gcc/x86_64-unknown-linux-gnu/13.2.0/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with:
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 13.2.0 (GCC)
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64' '-dumpdir' 'a-'
 
/gnu/store/vjjk375kysja1jz0837lypd09rdgs47c-gcc-13.2.0/libexec/gcc/x86_64-unknown-linux-gnu/13.2.0/cc1 
-quiet -v deflate.c -quiet -dumpdir a- -dumpbase deflate.c -dumpbase-ext 
.c -mtune=generic -march=x86-64 -version -o /tmp/ccffA64a.s
GNU C17 (GCC) version 13.2.0 (x86_64-unknown-linux-gnu)
	compiled by GNU C version 13.2.0, GMP version 6.2.1, MPFR version 
4.2.0, MPC version 1.3.1, isl version isl-0.24-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/no-gcc-local-prefix/include"
ignoring nonexistent directory 
"/gnu/store/m57d52krll9vlzmc0cqfg6dwn7n0p52j-gcc-13.2.0-lib/lib/gcc/x86_64-unknown-linux-gnu/13.2.0/../../../../../../../x86_64-unknown-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
  /gnu/store/0pr5ryw11f7pg5nhn42616k17ahdnily-profile/include
 
/gnu/store/m57d52krll9vlzmc0cqfg6dwn7n0p52j-gcc-13.2.0-lib/lib/gcc/x86_64-unknown-linux-gnu/13.2.0/include
 
/gnu/store/m57d52krll9vlzmc0cqfg6dwn7n0p52j-gcc-13.2.0-lib/lib/gcc/x86_64-unknown-linux-gnu/13.2.0/include-fixed
  /gnu/store/ln6hxqjvz6m9gdd9s97pivlqck7hzs99-glibc-2.35/include
End of search list.
Compiler executable checksum: cd54e13587d35c4cb99945e5484c0675
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64' '-dumpdir' 'a-'
  as -v --64 -o /tmp/cciGP5tQ.o /tmp/ccffA64a.s
GNU assembler version 2.38 (x86_64-unknown-linux-gnu) using BFD version 
(GNU Binutils) 2.38
COMPILER_PATH=/gnu/store/vjjk375kysja1jz0837lypd09rdgs47c-gcc-13.2.0/libexec/gcc/x86_64-unknown-linux-gnu/13.2.0/:/gnu/store/vjjk375kysja1jz0837lypd09rdgs47c-gcc-13.2.0/libexec/gcc/x86_64-unknown-linux-gnu/13.2.0/:/gnu/store/vjjk375kysja1jz0837lypd09rdgs47c-gcc-13.2.0/libexec/gcc/x86_64-unknown-linux-gnu/:/gnu/store/m57d52krll9vlzmc0cqfg6dwn7n0p52j-gcc-13.2.0-lib/lib/gcc/x86_64-unknown-linux-gnu/13.2.0/:/gnu/store/m57d52krll9vlzmc0cqfg6dwn7n0p52j-gcc-13.2.0-lib/lib/gcc/x86_64-unknown-linux-gnu/
LIBRARY_PATH=/gnu/store/0pr5ryw11f7pg5nhn42616k17ahdnily-profile/lib/:/gnu/store/m57d52krll9vlzmc0cqfg6dwn7n0p52j-gcc-13.2.0-lib/lib/gcc/x86_64-unknown-linux-gnu/13.2.0/:/gnu/store/m57d52krll9vlzmc0cqfg6dwn7n0p52j-gcc-13.2.0-lib/lib/gcc/x86_64-unknown-linux-gnu/13.2.0/../../../:/gnu/store/ln6hxqjvz6m9gdd9s97pivlqck7hzs99-glibc-2.35/lib
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64' '-dumpdir' 'a.'
 
/gnu/store/vjjk375kysja1jz0837lypd09rdgs47c-gcc-13.2.0/libexec/gcc/x86_64-unknown-linux-gnu/13.2.0/collect2 
-plugin 
/gnu/store/vjjk375kysja1jz0837lypd09rdgs47c-gcc-13.2.0/libexec/gcc/x86_64-unknown-linux-gnu/13.2.0/liblto_plugin.so 
-plugin-opt=/gnu/store/vjjk375kysja1jz0837lypd09rdgs47c-gcc-13.2.0/libexec/gcc/x86_64-unknown-linux-gnu/13.2.0/lto-wrapper 
-plugin-opt=-fresolution=/tmp/ccdr9flx.res 
-plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s 
-plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc 
-plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s 
--eh-frame-hdr -m elf_x86_64 -dynamic-linker 
/gnu/store/ln6hxqjvz6m9gdd9s97pivlqck7hzs99-glibc-2.35/lib/ld-linux-x86-64.so.2 
/gnu/store/0pr5ryw11f7pg5nhn42616k17ahdnily-profile/lib/crt1.o 
/gnu/store/0pr5ryw11f7pg5nhn42616k17ahdnily-profile/lib/crti.o 
/gnu/store/m57d52krll9vlzmc0cqfg6dwn7n0p52j-gcc-13.2.0-lib/lib/gcc/x86_64-unknown-linux-gnu/13.2.0/crtbegin.o 
-L/gnu/store/0pr5ryw11f7pg5nhn42616k17ahdnily-profile/lib 
-L/gnu/store/m57d52krll9vlzmc0cqfg6dwn7n0p52j-gcc-13.2.0-lib/lib/gcc/x86_64-unknown-linux-gnu/13.2.0 
-L/gnu/store/m57d52krll9vlzmc0cqfg6dwn7n0p52j-gcc-13.2.0-lib/lib/gcc/x86_64-unknown-linux-gnu/13.2.0/../../.. 
-L/gnu/store/ln6hxqjvz6m9gdd9s97pivlqck7hzs99-glibc-2.35/lib 
/tmp/cciGP5tQ.o -lgcc --push-state --as-needed -lgcc_s --pop-state 
-L/gnu/store/ln6hxqjvz6m9gdd9s97pivlqck7hzs99-glibc-2.35/lib 
-rpath=/gnu/store/ln6hxqjvz6m9gdd9s97pivlqck7hzs99-glibc-2.35/lib 
-rpath=/gnu/store/m57d52krll9vlzmc0cqfg6dwn7n0p52j-gcc-13.2.0-lib/lib 
-lgcc_s -lc -lgcc --push-state --as-needed -lgcc_s --pop-state 
/gnu/store/m57d52krll9vlzmc0cqfg6dwn7n0p52j-gcc-13.2.0-lib/lib/gcc/x86_64-unknown-linux-gnu/13.2.0/crtend.o 
/gnu/store/0pr5ryw11f7pg5nhn42616k17ahdnily-profile/lib/crtn.o
ld: /gnu/store/0pr5ryw11f7pg5nhn42616k17ahdnily-profile/lib/crt1.o: in 
function `_start':
(.text+0x17): undefined reference to `main'
...

Ekaitz@tuxedo ~/projects/nlnet/gzip-1.2.4 [env]$ exit

# Now with riscv64, crt1.o is passed using a relative path and it fails:
Ekaitz@tuxedo ~/projects/nlnet/gzip-1.2.4$ guix shell 
gcc-cross-riscv64-linux-gnu-toolchain
Ekaitz@tuxedo ~/projects/nlnet/gzip-1.2.4 [env]$ riscv64-linux-gnu-gcc 
-v deflate.c
Using built-in specs.
COLLECT_GCC=riscv64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/gnu/store/dl52ppai6dvdlw0jybx8qj5yvclhwqgl-gcc-cross-riscv64-linux-gnu-11.3.0/libexec/gcc/riscv64-linux-gnu/11.3.0/lto-wrapper
Target: riscv64-linux-gnu
Configured with:
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 11.3.0 (GCC)
COLLECT_GCC_OPTIONS='-v' '-march=rv64gc' '-mabi=lp64d' '-misa-spec=2.2' 
'-march=rv64imafdc' '-dumpdir' 'a-'
 
/gnu/store/dl52ppai6dvdlw0jybx8qj5yvclhwqgl-gcc-cross-riscv64-linux-gnu-11.3.0/libexec/gcc/riscv64-linux-gnu/11.3.0/cc1 
-quiet -v deflate.c -quiet -dumpdir a- -dumpbase deflate.c -dumpbase-ext 
.c -march=rv64gc -mabi=lp64d -misa-spec=2.2 -march=rv64imafdc -version 
-o /tmp/ccjXCE2o.s
GNU C17 (GCC) version 11.3.0 (riscv64-linux-gnu)
	compiled by GNU C version 11.3.0, GMP version 6.2.1, MPFR version 
4.2.0, MPC version 1.3.1, isl version isl-0.24-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/no-gcc-local-prefix/include"
ignoring nonexistent directory 
"/gnu/store/rn39sf79yb5wcfclkfxzwz8r71jmwi6c-gcc-cross-riscv64-linux-gnu-11.3.0-lib/lib/gcc/riscv64-linux-gnu/11.3.0/../../../../../../../riscv64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 
/gnu/store/rn39sf79yb5wcfclkfxzwz8r71jmwi6c-gcc-cross-riscv64-linux-gnu-11.3.0-lib/lib/gcc/riscv64-linux-gnu/11.3.0/include
 
/gnu/store/rn39sf79yb5wcfclkfxzwz8r71jmwi6c-gcc-cross-riscv64-linux-gnu-11.3.0-lib/lib/gcc/riscv64-linux-gnu/11.3.0/include-fixed
 
/gnu/store/f0rksvsrhzbn4ss4gd4p1s677awfzz08-glibc-cross-riscv64-linux-gnu-2.35/include
End of search list.
GNU C17 (GCC) version 11.3.0 (riscv64-linux-gnu)
	compiled by GNU C version 11.3.0, GMP version 6.2.1, MPFR version 
4.2.0, MPC version 1.3.1, isl version isl-0.24-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: c32f88db5f6319705b0dc5f3836ff976
COLLECT_GCC_OPTIONS='-v' '-march=rv64gc' '-mabi=lp64d' '-misa-spec=2.2' 
'-march=rv64imafdc' '-dumpdir' 'a-'
 
/gnu/store/dl52ppai6dvdlw0jybx8qj5yvclhwqgl-gcc-cross-riscv64-linux-gnu-11.3.0/libexec/gcc/riscv64-linux-gnu/as 
-v --traditional-format -march=rv64gc -march=rv64imafdc -mabi=lp64d 
-misa-spec=2.2 -o /tmp/ccLQFrsU.o /tmp/ccjXCE2o.s
GNU assembler version 2.38 (riscv64-linux-gnu) using BFD version (GNU 
Binutils) 2.38
COMPILER_PATH=/gnu/store/dl52ppai6dvdlw0jybx8qj5yvclhwqgl-gcc-cross-riscv64-linux-gnu-11.3.0/libexec/gcc/riscv64-linux-gnu/11.3.0/:/gnu/store/dl52ppai6dvdlw0jybx8qj5yvclhwqgl-gcc-cross-riscv64-linux-gnu-11.3.0/libexec/gcc/riscv64-linux-gnu/11.3.0/:/gnu/store/dl52ppai6dvdlw0jybx8qj5yvclhwqgl-gcc-cross-riscv64-linux-gnu-11.3.0/libexec/gcc/riscv64-linux-gnu/:/gnu/store/rn39sf79yb5wcfclkfxzwz8r71jmwi6c-gcc-cross-riscv64-linux-gnu-11.3.0-lib/lib/gcc/riscv64-linux-gnu/11.3.0/:/gnu/store/rn39sf79yb5wcfclkfxzwz8r71jmwi6c-gcc-cross-riscv64-linux-gnu-11.3.0-lib/lib/gcc/riscv64-linux-gnu/
CROSS_LIBRARY_PATH=/gnu/store/rn39sf79yb5wcfclkfxzwz8r71jmwi6c-gcc-cross-riscv64-linux-gnu-11.3.0-lib/lib/gcc/riscv64-linux-gnu/11.3.0/:/gnu/store/rn39sf79yb5wcfclkfxzwz8r71jmwi6c-gcc-cross-riscv64-linux-gnu-11.3.0-lib/lib/gcc/riscv64-linux-gnu/11.3.0/../../../../riscv64-linux-gnu/lib/:/gnu/store/f0rksvsrhzbn4ss4gd4p1s677awfzz08-glibc-cross-riscv64-linux-gnu-2.35/lib
COLLECT_GCC_OPTIONS='-v' '-march=rv64gc' '-mabi=lp64d' '-misa-spec=2.2' 
'-march=rv64imafdc' '-dumpdir' 'a.'
 
/gnu/store/dl52ppai6dvdlw0jybx8qj5yvclhwqgl-gcc-cross-riscv64-linux-gnu-11.3.0/libexec/gcc/riscv64-linux-gnu/11.3.0/collect2 
-plugin 
/gnu/store/dl52ppai6dvdlw0jybx8qj5yvclhwqgl-gcc-cross-riscv64-linux-gnu-11.3.0/libexec/gcc/riscv64-linux-gnu/11.3.0/liblto_plugin.so 
-plugin-opt=/gnu/store/dl52ppai6dvdlw0jybx8qj5yvclhwqgl-gcc-cross-riscv64-linux-gnu-11.3.0/libexec/gcc/riscv64-linux-gnu/11.3.0/lto-wrapper 
-plugin-opt=-fresolution=/tmp/cc0p0r5t.res 
-plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s 
-plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc 
-plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s 
--sysroot=/ --eh-frame-hdr -melf64lriscv -dynamic-linker 
/gnu/store/f0rksvsrhzbn4ss4gd4p1s677awfzz08-glibc-cross-riscv64-linux-gnu-2.35/lib/ld-linux-riscv64-lp64d.so.1 
crt1.o 
/gnu/store/rn39sf79yb5wcfclkfxzwz8r71jmwi6c-gcc-cross-riscv64-linux-gnu-11.3.0-lib/lib/gcc/riscv64-linux-gnu/11.3.0/crti.o 
/gnu/store/rn39sf79yb5wcfclkfxzwz8r71jmwi6c-gcc-cross-riscv64-linux-gnu-11.3.0-lib/lib/gcc/riscv64-linux-gnu/11.3.0/crtbegin.o 
-L/gnu/store/rn39sf79yb5wcfclkfxzwz8r71jmwi6c-gcc-cross-riscv64-linux-gnu-11.3.0-lib/lib/gcc/riscv64-linux-gnu/11.3.0 
-L/gnu/store/rn39sf79yb5wcfclkfxzwz8r71jmwi6c-gcc-cross-riscv64-linux-gnu-11.3.0-lib/lib/gcc/riscv64-linux-gnu/11.3.0/../../../../riscv64-linux-gnu/lib 
-L/gnu/store/f0rksvsrhzbn4ss4gd4p1s677awfzz08-glibc-cross-riscv64-linux-gnu-2.35/lib 
/tmp/ccLQFrsU.o -lgcc --push-state --as-needed -lgcc_s --pop-state 
-L/gnu/store/f0rksvsrhzbn4ss4gd4p1s677awfzz08-glibc-cross-riscv64-linux-gnu-2.35/lib 
-rpath=/gnu/store/f0rksvsrhzbn4ss4gd4p1s677awfzz08-glibc-cross-riscv64-linux-gnu-2.35/lib 
-rpath=/gnu/store/rn39sf79yb5wcfclkfxzwz8r71jmwi6c-gcc-cross-riscv64-linux-gnu-11.3.0-lib/riscv64-linux-gnu/lib 
-lgcc_s -lc -lgcc --push-state --as-needed -lgcc_s --pop-state 
/gnu/store/rn39sf79yb5wcfclkfxzwz8r71jmwi6c-gcc-cross-riscv64-linux-gnu-11.3.0-lib/lib/gcc/riscv64-linux-gnu/11.3.0/crtend.o 
/gnu/store/rn39sf79yb5wcfclkfxzwz8r71jmwi6c-gcc-cross-riscv64-linux-gnu-11.3.0-lib/lib/gcc/riscv64-linux-gnu/11.3.0/crtn.o
riscv64-linux-gnu-ld: cannot find crt1.o: No such file or directory
collect2: error: ld returned 1 exit status
```