在链接与运行地址不同时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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值