RISC-V下基于binutils2.30移植GCC9.3.0/10.3.0出现ld仿真模式错误
问题排查与解决方法
根因确认
该报错的核心原因是 binutils 2.30版本的RISC-V链接器(ld)不支持带_lp64/_ilp32后缀的仿真模式命名,这类ABI后缀是更高版本binutils才引入的特性。你使用的GCC 9.3.0默认会向ld传递elf64lriscv_lp64的仿真参数,和旧版binutils的支持范围不匹配。
你可以执行以下命令验证ld的支持范围:riscv64-unknown-linux-gnu-ld -V
输出结果中只会包含报错提示的elf64lriscv、elf32lriscv两个可选仿真模式,不存在带ABI后缀的选项。
解决方案(二选一即可)
方案1:适配现有版本无需升级
- 单次编译临时规避:执行编译命令时手动指定ld的仿真模式,添加
-Wl,-melf64lriscv参数即可:gcc hello.c -o test -Wl,-melf64lriscv - 永久生效:重新编译GCC,在原configure参数基础上追加
--with-ld-emulation=elf64lriscv,编译安装后GCC会默认传递正确的仿真模式,无需每次手动加参数。
另外可检查binutils的编译配置,你当前的binutils编译命令未添加--disable-multilib,如果开启了multilib也可能导致仿真模式匹配异常,建议编译binutils时和GCC一样添加--disable-multilib参数后重新编译,再重新编译GCC验证。
方案2:升级binutils版本
将binutils升级到2.32及以上版本,即可原生支持带_lp64后缀的仿真模式,无需修改GCC的任何配置,适配性更强。
内容的提问来源于stack exchange,提问作者Jagan Sivakumar
相关产品推荐
相关产品推荐

