在連結與執行地址不同時gdb的除錯方法

LIalan發表於2024-09-20

搭建一個連結和執行不同的環境

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

相關文章