Динамическое связывание: значение смещения, используемое для индексации таблицы перемещения - PullRequest
1 голос
/ 31 августа 2011

Я пытаюсь понять процесс динамического связывания ... вызов библиотечной функции (давайте назовем ее func) проходит через таблицу plt.Я знаю, когда символ еще не перемещен, вызов функции передается из таблицы plt, которая содержит istruction (скажем, i1), например, jmp *function_in_GOT, которая указывает на следующую инструкцию после i1, которая выглядит как push $offset.: после того, как управление передано динамическому компоновщику, который фиксирует относительную запись GOT с адресом функции.offset должно быть индексом записи в таблице перемещений, но я не понимаю ... как это значение можно найти, прочитав эльф исполняемого файла.Можно ли с

objdump --dynamic-reloc prog

что-то найти?Например, я написал очень простую программу, которая использует только printf и strcpy и вывод предыдущей команды:

DYNAMIC RELOCATION RECORDS
OFFSET   TYPE              VALUE 
08049ff0 R_386_GLOB_DAT    __gmon_start__
0804a000 R_386_JUMP_SLOT   __gmon_start__
0804a004 R_386_JUMP_SLOT   __libc_start_main
0804a008 R_386_JUMP_SLOT   strcpy
0804a00c R_386_JUMP_SLOT   printf

Например, прочитав gdb инструкции, начинающиеся с printf@plt:

0x8048324 <printf@plt>: jmp    *0x804a00c
0x804832a <printf@plt+6>:   push   $0x18
0x804832f <printf@plt+11>:  jmp    0x80482e4

мы можем видеть, что значение для offset равно 0x18 (24 в десятичном виде), но чтение результата objdump кажется, что смещение printf от первой записи перемещенияЭто 0x1c.

Некоторые идеи?

Ответы [ 2 ]

1 голос
/ 02 сентября 2012

Да, смещение - это индекс таблицы перемещения файлов.

Из версии спецификации ELF 1.2:

5.Следовательно, программа помещает смещение (смещение) перемещения в стек.Смещение перемещения - это 32-разрядное неотрицательное байтовое смещение в таблице перемещения.Назначенная запись перемещения будет иметь тип R_386_JMP_SLOT, а ее смещение будет указывать запись таблицы глобальных смещений, использованную в предыдущей инструкции jmp.Запись о перемещении также содержит индекс таблицы символов, таким образом сообщая динамическому компоновщику, на какой символ ссылаются, в данном случае name1.

Но я не знаю, почему расхождения в ваших результатах.

1 голос
/ 05 ноября 2011

Это не то, как работает PLT. Чтобы понять, как работает , я рекомендую начать с , читая эту статью .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...