为什么当我在 gdb 中调试 asm 源时,为代码的起始入口点选择的地址是 0x8048080?这只是一个相对偏移量,而不是指令内存中的实际偏移量,对吗?
最佳答案
地址0x8048080
没有特殊意义,但地址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; }
程序,我在 0x8048300
、0x8048178
或 0x8048360
处得到 &_start == &.text
,取决于我使用的编译器。
关于linux - 地址0x8048080的意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5928869/