riscv32-elf-gcc在debian12上直接Segmentation fault

有个github repo要编译需要安装他们提供的riscv gcc编译工具。repo在ubuntu 20.04上可以正常编译。

然后我想把编译环境迁移到debian 12上来,发现他们提供的riscv gcc在debian 12上无法运行了。查看version信息是可以显示的,但是去编译.c文件就会出现下面错误:

./riscv32-elf-gcc ~/a.c
Segmentation fault

他们的文档里推荐使用ubuntu 20.04,我原本以为debian和ubuntu差别不大,应该可以通用。结果看来并不可行。
难道是因为glibc版本不一致吗?debian12的glibc版本太新了?

就是debian有问题,跟glibc版本也没啥关系,试了一下archlinux,可以正常运行。
比如编译一个空的.c文件,没有段错误:

$ ./riscv32-elf-gcc ~/a.c
/home/renxiuhu/opt/risc-v/nds32le-elf-mculib-v5f/bin/../lib/gcc/riscv32-elf/10.4.0/../../../../riscv32-elf/bin/ld: /home/renxiuhu/opt/risc-v/nds32le-elf-mculib-v5f/bin/../lib/gcc/riscv32-elf/10.4.0/../../../../riscv32-elf/lib/crt0.o: in function `.L0 ':
(.text+0x52): undefined reference to `main'
collect2: error: ld returned 1 exit status

不用你们回复了,我自己找到解决办法了。哼

-2cc06365cb2f0ed

其实是信息太少不知道说什么好。
提到有个 repo 但是没有具体地址;说编译工具链会段错误又没说到底是预编译二进制还是编译后不能用。不过既然问题解决了那就太好了 :cat2:

实际上二进制程序如果跨发行版而且还跨大版本不一定能运行,能运行只能说运气好;
如果你打算用预编译二进制工具链其实我推荐你用 podman/docker/lxc/systemd-nspawn 创建一个 chroot jail 或者容器来用。

其实就是一个芯片厂商提供的编译好可以直接运行的risc-v gcc compiler,用于编他们的SDK。
如果是debian上自己按照apt源里的risc-v compiler或自己源码编译一个,运行是没问题的。但是编译不了SDK,所以只能用他们提供的,但是又不知道他们编译的时候都用了哪些编译选项,导致到了debian上运行不了。

请问您最后解决的方法是什么?联系厂商获取risc-v compiler的编译选项吗?

编译器依赖vsyscall,而debian上vsyscall默认是关闭的。在grub里加上vsyscall=emulate就能用了

1 个赞

解决了!非常感谢!