1

私は動的リンクプロセスを理解しようとしています...ライブラリ関数への呼び出し(それを呼び出しましょうfunc)はテーブルを通過しpltます。シンボルがまだ再配置されていないとき、関数の呼び出しが次の命令を指すような命令pltを含むテーブルから渡されることを知っています。関数のアドレスを含むエントリ。再配置テーブルのエントリのインデックスである必要がありますが、わかりません...実行可能ファイルのelfを読み取ってこの値を見つける方法がわかりません。で可能ですi1jmp *function_in_GOTi1push $offsetGOToffset

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オフセットは のようです。printf0x1c

いくつかのアイデア?

4

2 に答える 2

1

はい、offset はファイル再配置テーブルのインデックスです。

ELF 仕様バージョン 1.2 から:

5. その結果、プログラムは再配置オフセット (オフセット) をスタックにプッシュします。再配置オフセットは、再配置テーブルへの 32 ビットの負でないバイト オフセットです。指定された再配置エントリはタイプ R_386_JMP_SLOT を持ち、そのオフセットは前の jmp 命令で使用されたグローバル オフセット テーブル エントリを指定します。再配置エントリにはシンボル テーブル インデックスも含まれているため、ダイナミック リンカにどのシンボルが参照されているか (この場合は name1) が通知されます。

しかし、なぜあなたの結果に矛盾があるのか​​ わかりません。

于 2012-09-02T01:19:22.293 に答える
1

これは、実際には PLT の仕組みではありません。それがどのように機能するかを理解するには、この記事を読むことから始めることをお勧めします。

于 2011-11-05T08:08:05.267 に答える