在GNU汇编器中获取标签地址遇赋值为0问题,求排查方案
在GNU汇编器(RISC-V)中用
.word存储标签地址显示为0的问题解决 你的问题核心是混淆了汇编阶段和链接阶段的作用:你当前查看的是未链接的目标文件(test.o),此时汇编器还无法确定data_r的最终绝对地址,所以会用0x00000000作为占位符,等待链接器后续填充正确地址。
验证重定位项的存在
你可以用readelf查看目标文件的重定位表,确认data位置确实存在指向data_r的重定位请求:
riscv64-unknown-elf-readelf -r test.o
输出会包含类似如下的条目:
Relocation section '.rel.text' at offset 0x40 contains 1 entry: Offset Info Type Sym.Value Sym. Name 00000000 00000201 R_RISCV_32 00000000 data_r
解决方案:完成链接步骤
只有链接器将目标文件合并为可执行文件后,才会把data_r的最终绝对地址填入data的.word中。执行以下命令:
riscv64-unknown-elf-ld -o test test.o && riscv64-unknown-elf-objdump -dsS test
此时查看反汇编结果,data的位置就会显示data_r的正确绝对地址(具体值取决于链接脚本的起始地址,比如默认可能是0x10004)。
关于地址列表的写法
你当前的写法data: .word data_r完全正确,如果要存储多个地址,直接扩展即可:
data: .word data_r, data_s, data_t data_r: .byte 0x65 data_s: .byte 0x66 data_t: .byte 0x67 main: j main
链接后,data区域会依次填充三个标签的正确地址。
内容的提问来源于stack exchange,提问作者grilix
相关产品推荐
相关产品推荐

