значимость адреса 0x8048080 - PullRequest
3 голосов
/ 08 мая 2011

почему, когда я отлаживаю исходный код asm в gdb, это адрес 0x8048080, выбранный для начальной точки входа в код?это только относительное смещение, а не фактическое смещение в память инструкции, верно?

Ответы [ 2 ]

2 голосов
/ 09 мая 2011

Нет особого значения для адреса 0x8048080, но есть значение для адреса 0x08048000.

Последний адрес является адресом по умолчанию, с которого ld запускает первый сегмент PT_LOAD в Linux / x86. В 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 голос
/ 08 мая 2011

0 × 8048080 - это точка входа по умолчанию в виртуальной памяти, используемая компоновщиком Linux ld.Вы можете изменить его на любое другое.

для получения более подробной информации проверьте: http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints/

...