私は動的リンクプロセスを理解しようとしています...ライブラリ関数への呼び出し(それを呼び出しましょうfunc
)はテーブルを通過しplt
ます。シンボルがまだ再配置されていないとき、関数の呼び出しが次の命令を指すような命令plt
を含むテーブルから渡されることを知っています。関数のアドレスを含むエントリ。再配置テーブルのエントリのインデックスである必要がありますが、わかりません...実行可能ファイルのelfを読み取ってこの値を見つける方法がわかりません。で可能です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
(10 進数で 24) であることがわかりますが、出力を読み取ると、最初の reloc エントリからのobjdump
オフセットは のようです。printf
0x1c
いくつかのアイデア?