为什么当我在 gdb 中调试 asm 源是 0x8048080 时,为代码的起始入口点选择的地址?这只是相对偏移量,而不是指令内存的实际偏移量,对吗?
2 回答
address 没有特别的意义0x8048080
,但是 address 有一个含义0x08048000
。
后一个地址是默认地址,在 Linux/x86上ld
开始第一个段。PT_LOAD
在 Linux/x86_64 上,默认值为0x400000
,您可以使用“自定义”链接描述文件更改默认值。您还可以更改.text
部分以-Wl,-Ttext,0xNNNNNNNN
标志开头的位置。
在ld
开始之后0x08048000
,它为程序头添加空间,并根据其内置的链接器脚本继续链接可执行文件的其余部分,如果您传递-Wl,--verbose
到链接行,您可以查看该脚本。
对于您的程序,程序头的大小似乎始终为0x80
,因此您的.text
部分始终从 开始0x8048080
,但这绝不是普遍的。
当我链接一个琐碎的int main() { return 0; }
程序时,我会得到&_start == &.text
或0x8048300
,0x8048178
这0x8048360
取决于我使用的编译器。
0×8048080 是 Linux ld 链接器使用的虚拟内存中的默认入口点。您可以将其更改为您想要的任何内容。
有关更多详细信息,请查看:http ://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints/