GDB отключает ASLR по умолчанию.Если вы set disable-randomization off
, то исполняемый файл PIE (Position Indepdent) будет загружаться по случайному адресу, даже если вы run
его изнутри GDB.
См. 32-битные абсолютные адреса больше не разрешены вx86-64 Linux? для получения дополнительной информации о PIE.
Position- зависимые исполняемые файлы всегда загружаются по одному и тому же адресу, и только их адрес стека может бытьрандомизированы.Код + данные могут жестко кодировать адреса как 32-битные абсолютные, и они не содержат информации о перемещении для каждого места, где это было сделано.(например, как mov $string, %edi
; call puts
).
Посмотрите на код gcc для Hello World с / без -fPIE
в проводнике компилятора Godbolt .
.LC0:
.string "Hello World!"
main:
lea rdi, .LC0[rip] # RIP-relative with -fPIE
sub rsp, 8
call puts@PLT
xor eax, eax
add rsp, 8
ret
но с -fno-PIE
(по умолчанию на Godbolt, часто не по умолчанию на современных дистрибутивах Linux), вы получаете mov edi, OFFSET FLAT:.LC0
, 32-битный абсолютный адрес.
(остальная часть кодато же самое, за исключением того, что он испускает call puts
и позволяет компоновщику преобразовать это в call puts@PLT
. Используйте -fno-plt
, чтобы встроить косвенный call
через адрес GOT.)