在链接与运行地址不同时gdb的调试方法
搭建一个链接和运行不同的环境
SECTIONS
{
. = 0xffff000000080000,
/* . = 0x80000, */
.text.boot : { *(.text.boot) }
.text : { *(.text) }
.rodata : { *(.rodata) }
.....
}
-s还可以看到符号都链接到高地址去了
但是elf文件中有详细的地址信息,如果后续qemu加载的是elf的话就会按照elf加载,但是这并不是我们所希望的,所以通过下面的语句生成一个裸的二进制文件,没有地址信息
aarch64-linux-gnu-objcopy build/benos.elf -O binary benos.bin
但是将通过kernel参数将可执行文件bin传入,放置在默认的地址0x80000
qemu-system-aarch64 -machine raspi4b -nographic -kernel benos.bin -S -s
造成了运行地址和链接地址不同,这样通过gdbsever调试的时候无法正常的读取elf文件中的信息进行调试。
解决
在gdb中使用 add-symbol-file
将elf的符号信息加入,并且设置每个段实际的运行地址,这样在gdb调试的时候就会通过产生的偏移来调试
add-symbol-file build/benos.elf 0x80030 -s .text.boot 0x80000 -s .rodata 0x802d0
每个段的位置可以通过readelf得到的每个段的偏移+0x80000计算出来
一劳永逸:在 .gdbinit
加入
target remote localhost:1234
add-symbol-file build/benos.elf 0x80030 -s .text.boot 0x80000 -s .rodata 0x802d0
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具