Статический адрес и адрес исполнения в загрузчике эльфов - PullRequest
0 голосов
/ 25 января 2019

Я пишу Elf Loader для ARM / ARM64.При обработке динамических перемещений меня немного смутили некоторые термины / символы в документации , которой я следую.На стр. 14 указано,

«S (при самостоятельном использовании) является адресом символа».«P - это адрес перемещаемого места (полученный из r_offset).»

«Дельта (S), если S является нормальным символом, разрешает разницу между статическим адресом ссылки S и адресом выполненияof S. Если S является нулевым символом (индекс символа ELF 0), разрешается разница между адресом статической ссылки P и адресом выполнения P. "

Из того, что я собираю, я полагаю, что"адрес выполнения "из S (или P) должен быть адресом символа в области памяти процесса, но я не уверен, что подразумевается под" адресом статической ссылки ".

Если кто-то может уточнить терминологию, которая была бы полезнаСпасибо.

1 Ответ

0 голосов
/ 27 января 2019

что означает "адрес статической ссылки".

Исполняемый файл без 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 в случае пирога.

...