Linux
上的GNU ld
也选择了同样的地址。$ ld -verbose | grep -i text-segment
PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000)); . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS;
这让人感到惊讶,因为在32位x86可执行文件中,这个地址是更大的:
$ ld -verbose | grep -i text-segment
PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x08048000)); . = SEGMENT_START("text-segment", 0x08048000) + SIZEOF_HEADERS;
我阅读了这个问题,讨论了为什么在i386架构中选择0x080xxxxx地址作为入口点,但没有解释为什么在x86_64中发生了变化。很难找到任何关于此事的解释。有人知道吗?