链接脚本生成ELF文件时.test段与.text.ssc_entry段字节差异疑问
这种情况大概率是正常的,核心原因是链接阶段的重定位操作
- 目标文件(
main.o)里的.text.ssc_entry段包含的是未重定位的指令:比如分支、跳转类指令的地址字段,在编译生成.o文件时只是占位值(比如相对偏移或临时填充的0值),并没有绑定到实际运行时的内存地址。 - 当链接器按照你的脚本把该段合并到
.test段并分配到指定的BRAM内存区域时,会根据该区域的基址修正所有地址相关的指令字段。如果前两个字节正好是指令中的地址部分,就会被替换成实际运行时的有效地址,这就导致了和.o文件中原段的差异。 - 你提到右侧字节完全一致,这反而印证了逻辑的正确性:指令的操作码部分(通常是指令的固定位置)不需要修改,只有地址相关的字段被链接器重定位修正。
验证方法
- 用
objdump -d main.o查看.text.ssc_entry段的反汇编,对比objdump -d 你的最终ELF文件里.test段的反汇编,你会看到.o文件里的跳转/分支指令地址是占位值,而ELF文件里是实际的运行地址。 - 用
readelf -r main.o查看.text.ssc_entry段的重定位表,如果存在针对前两个字节的重定位项,就能直接证明链接器需要修改这些字节来完成地址绑定。
内容的提问来源于stack exchange,提问作者yibiaowang
相关产品推荐
相关产品推荐

