Я скомпилировал программу Hello World C, и это информация file
:
hello: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=3c4fc3bc82d53281357312935790846333a3c7bc, with debug_info, not stripped
Когда я проверяю информацию заголовка сегмента, я вижу, что VirtAddr для сегмента LOAD указывает на адрес 0x0000000000000000, который определен как NULL. Адрес входа 0x540, который указывает, что он находится в первом сегменте LOAD из двух. Флаг E (execute) и секция .text также отображаются на первый сегмент LOAD.
Когда я использую gdb и устанавливаю точку останова в main, я вижу, что адрес меняется, что означает, что адреса были смещены на определенное смещение. Почему это случилось? Я пытался загрузить программу несколько раз, но смещение остается постоянным, что означает отсутствие рандомизации адресов. Я вижу другие вопросы о SO, которые получают адрес загрузки прямо напротив моего. Почему? То же самое происходит, когда я компилирую с -m32
. Что-то изменилось по сравнению с linux в последние годы, когда я получил другой вывод из связанного вопроса?