交叉编译RISCV64架构Valgrind工具时遇段错误求助
RISC-V64交叉编译Valgrind时ld段错误的解决方案
问题重现
在x86架构的Ubuntu 22.04(内核5.15)宿主机上,编译RISC-V64版本的Valgrind(使用valgrind-riscv64仓库),执行以下命令:
git clone https://github.com/petrpavlu/valgrind-riscv64 ./autogenerate.sh export CROSS_COMPILE=/opt/riscv/bin/riscv64-unknown-linux-gnu- ./configure --target=riscv64-unknown-linux-gnu \ --host=riscv64-unknown-linux-gnu \ --prefix=/opt/valgrind-riscv64 \ CFLAGS=-static \ CC=${CROSS_COMPILE}gcc \ CPP=${CROSS_COMPILE}cpp \ CXX=${CROSS_COMPILE}g++ \ LD=${CROSS_COMPILE}ld \ AR=${CROSS_COMPILE}ar make
编译过程中触发错误:
collect2: fatal error: ld terminated with signal 11 [Segmentation fault], core dumped
解决建议
- 升级RISC-V交叉工具链
老旧版本的RISC-V ld工具可能存在已知bug,执行${CROSS_COMPILE}ld --version查看当前版本,若版本低于gcc 12.x,建议更新到最新的riscv-gnu-toolchain。可下载官方预编译包替换,或自行编译工具链。 - 移除静态编译参数
CFLAGS=-static会强制静态链接,导致ld需要处理大量静态库文件,容易触发内存相关的段错误。去掉该参数后,重新运行configure和make尝试编译。 - 优化编译并发数与ld参数
多线程编译可能导致内存占用过载,尝试用make -j$(nproc --ignore=2)控制并发数(根据宿主机CPU核心数调整)。同时给ld添加内存优化参数,修改configure命令如下:./configure --target=riscv64-unknown-linux-gnu \ --host=riscv64-unknown-linux-gnu \ --prefix=/opt/valgrind-riscv64 \ LDFLAGS='--no-keep-memory' \ CC=${CROSS_COMPILE}gcc \ CPP=${CROSS_COMPILE}cpp \ CXX=${CROSS_COMPILE}g++ \ LD=${CROSS_COMPILE}ld \ AR=${CROSS_COMPILE}ar - 拉取仓库最新代码
进入valgrind-riscv64目录,执行git pull获取最新提交,仓库可能已经修复了编译相关的兼容性问题。
内容的提问来源于stack exchange,提问作者Mirco Mannino
相关产品推荐
相关产品推荐

