You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LLVM RISC-V交叉编译中jal跳转指令符号解析异常求助

RISC-V交叉编译中JAL指令符号解析失败的问题排查

我在使用LLVM进行RISC-V交叉编译C程序时,遇到跳转指令编译异常的问题:rom.s中的jal ra, main指令,编译生成rom.o后,通过llvm-objdump查看rom.dmp,显示为jal ra, 0(偏移量始终为0,跳转到自身),推测编译器未能正确解析跳转指令中的函数符号。

编译脚本(compile.sh)

#!/bin/sh

clang -c --sysroot=/<path_to_tool_chain>/riscv32-unknown-linux-gnu/ \
        rom.s --target=riscv32 -march=rv32i -mabi=ilp32 -o rom.o

llvm-objdump -d rom.o |& tee rom.dmp

排查要点与解决方法

  • 确认符号归属的编译单元:如果main函数定义在其他C文件(比如main.c),单独编译rom.s时,clang无法获取该符号的地址,会暂时将偏移量设为0,正确的地址会在链接阶段填充。可以将rom.s和main.c一起编译,或先编译main.c生成main.o,再通过链接器合并处理。
  • 添加外部符号声明:在rom.s开头添加.extern main,明确告知汇编器main是外部符号,需要在链接阶段解析地址。
  • 检查LLVM工具链版本:部分旧版本LLVM对RISC-V的符号解析存在bug,建议升级到LLVM 15.x及以上版本,同时确保sysroot中的RISC-V工具链组件版本匹配且完整。
  • 查看编译详细日志:在编译命令中加入-v参数(clang -v -c ...),查看编译过程的警告信息,通常会直接提示符号未定义的相关问题。
  • 验证链接后的结果:单独编译汇编文件得到的目标文件中,未解析符号的跳转地址为0是正常现象。将rom.o和包含main定义的目标文件链接生成可执行文件后,再用llvm-objdump查看,跳转地址会被正确填充。

内容的提问来源于stack exchange,提问作者noji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 22:10:35