3

为什么当我在 gdb 中调试 asm 源是 0x8048080 时,为代码的起始入口点选择的地址?这只是相对偏移量,而不是指令内存的实际偏移量,对吗?

4

2 回答 2

4

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 == &.text0x80483000x80481780x8048360取决于我使用的编译器。

于 2011-05-09T00:14:34.067 回答
1

0×8048080 是 Linux ld 链接器使用的虚拟内存中的默认入口点。您可以将其更改为您想要的任何内容。

有关更多详细信息,请查看:http ://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints/

于 2011-05-08T17:03:16.640 回答