Код: Выделить всё
#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);
}
Во время отладки с помощью 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Где я ошибся? Я неправильно понимаю, как вычислить адрес, или я пропустил шаг? Буду признателен за любые разъяснения или идеи по этому поводу.
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/798 ... alculation
Мобильная версия