Непонятно динамическое связывание в ELF: непонимание расчета адресаLinux

Ответить
Anonymous
 Непонятно динамическое связывание в ELF: непонимание расчета адреса

Сообщение Anonymous »

В настоящее время я улучшаю свое понимание двоичных файлов ELF, уделяя особое внимание динамическому связыванию и роли разделов .got.plt и .plt. Чтобы изучить это, я создал следующий пример программы:

Код: Выделить всё

#include 

int main(int argc, char **av) {
ssize_t count = 0;
char buf[256];

// Calling read function twice
read(STDIN_FILENO, buf, 0);
read(STDIN_FILENO, buf, 0);
}
Как видите, я вызываю функцию чтения дважды. Поскольку мой двоичный файл динамически связан, ожидаемое поведение во время выполнения заключается в том, что во время первого вызова фактический адрес функции чтения будет разрешен в libc, раздел .got.plt будет обновлен, и функция будет выполнена. Для второго вызова адрес должен перейти непосредственно к функции.
Во время отладки с помощью GDB я заметил, что адрес функции чтения разрешается в 0x7ffff7d1ba80 после первого вызова. Этот адрес является согласованным, когда я выполняю команду p read в GDB для печати адреса символа.
Из любопытства я попытался вычислить адрес вручную. Я выполнил следующие шаги:
Я запустил `info proc Map` в GDB, чтобы найти местоположение libc в памяти. Я увидел, что раздел исполняемого файла начинается с адреса 0x00007ffff7c28000.
Изображение
[вывод команды info proc map]!
Затем я использовал команду readelf -s /lib/x86_64-linux-gnu/libc.so.6 | grep read, чтобы найти смещение функции чтения в общей библиотеке. Это дало мне следующий результат:
Изображение

[вывод команды readelf -s]!
Мы видим, что смещение чтения равно `0x11ba80`.
Я предположил, что для вычисления адреса чтения функции, мне следует добавить это смещение к начальному адресу общей библиотеки. Поэтому я посчитал:

Код: Выделить всё

0x00007ffff7c28000 + 0x11ba80 = 0x7ffff7d43a80
Однако это значение 0x7ffff7d43a80 не совпадает с адресом, показанным в GDB (0x7ffff7d1ba80), и я не знаю почему.
Где я ошибся? Я неправильно понимаю, как вычислить адрес, или я пропустил шаг? Буду признателен за любые разъяснения или идеи по этому поводу.
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/798 ... alculation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»