что означает "адрес статической ссылки".
Исполняемый файл без PIE связан с загрузкой по определенному адресу.Например, в x86_64
Linux по умолчанию статический адрес ссылки равен 0x400000
:
echo "int main() { return 0; }" | gcc -xc - -no-pie
readelf -Wl a.out | grep LOAD
LOAD 0x000000 0x0000000000400000 0x0000000000400000 0x000618 0x000618 R E 0x200000
LOAD 0x000e50 0x0000000000600e50 0x0000000000600e50 0x0001d8 0x0001e0 RW 0x200000
Этот двоичный файл связан со статическим адресом ссылки 0x400000
, и символы в нем отражают, что:
nm a.out | grep ' main'
0000000000400487 T main
Этот исполняемый файл должен быть загружен на 0x400000
и не будет работать правильно, если загружен где-либо еще.
Обратите внимание, что по умолчанию не-PIE статический адрес ссылки
- отличается для разных архитектур (
i386
по умолчанию 0x8048000
), и - может быть изменено во время статической связи через скрипт компоновщика и / или флаги компоновщика.
Сравните это с исполняемым файлом PIE, который обычно связан по адресу статической ссылки 0
:
echo "int main() { return 0; }" | gcc -xc - -fPIE -pie
readelf -Wl a.out | grep LOAD
LOAD 0x000000 0x0000000000000000 0x0000000000000000 0x0007d8 0x0007d8 R E 0x200000
LOAD 0x000e18 0x0000000000200e18 0x0000000000200e18 0x000210 0x000218 RW 0x200000
nm a.out | grep ' main'
00000000000005fa T main
Таким образом, адрес статической ссылки main
равен 0x400487
в случае без PIEи 0x5fa
в случае пирога.