Я пытаюсь понять процесс динамического связывания ... вызов библиотечной функции (давайте назовем ее 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
.
Некоторые идеи?