在链接与运行地址不同时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

__EOF__

本文作者alan
本文链接https://www.cnblogs.com/alanli07/p/18423392.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   LIalan  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体
点击右上角即可分享
微信分享提示