В этом документе на стр. 27 говорится, что текстовый сегмент начинается с
0x400000. Почему именно этот адрес был выбран? Есть ли
причина для этого? Тот же адрес выбирается в GNU ld
на Linux
:
$ 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;
Я читаю этот вопрос, в котором обсуждается, почему был выбран адрес 0x080xxxxx для i386, но это не объясняет изменения в x86_64. Трудно найти любое объяснение по этому вопросу. Кто-нибудь знает?