为什么当我在gdb中调试asm源时,为起始入口点选择的地址为0x8048080?这只是一个相对偏移量,而不是指令的实际内存偏移量,对吗?
答案 0 :(得分:2)
解决0x8048080
没有特别重要意义,但地址0x08048000
有一个。
后一个地址是默认地址,ld
启动Linux / x86上的第一个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
,具体取决于我使用的编译器。
答案 1 :(得分:1)
0×8048080是Linux ld链接器使用的虚拟内存中的默认入口点。您可以将其更改为您想要的任何内容。
了解更多详情,请查看:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints/