PLTテーブルとGOTテーブル



Plt Table Got Table



プログラムがコンパイルされると、2つのテーブルが支援に使用されます。1つはPLTテーブルで、もう1つはGOTテーブルです。 PLTテーブルは内部関数テーブルと呼ぶことができ、GOTテーブルはグローバル関数テーブルです。これらの2つのテーブルは対応しています。



PLTテーブルの各アイテムのデータコンテンツは、GOTテーブルの対応するアイテムのアドレスです。これは修正されました。 PLTテーブルのデータは、関数の実際のアドレスではなく、GOTテーブルアイテムのアドレスです。
@pltフラグを使用して関数を入力すると、この関数は実際には一時的な効果になります。これは、GOTエントリのデータが関数の最終アドレスであり、PLTテーブルのデータがGOTテーブルエントリのアドレスであるためです。 PLTテーブルを介してGOTテーブルにジャンプし、関数の実際のアドレスを取得できます。
@plt関数は、コンパイルシステム自体によって追加されます。



この関数のコードは3行のみです。最初の行がジャンプし、その役割はPLTテーブルを介してGOTテーブルにジャンプすることです。特定の関数を最初に実行する前に、この関数のPLTテーブルに対応するGOTテーブルのデータを使用します。 is @plt関数の2行目の命令のアドレスは次の図のとおりです。
1.jmp命令がGOTテーブルにジャンプします
2.GOTテーブルのデータは0x400486です
3.命令アドレスへのジャンプは0x400486です
4.プッシュ0x3#を実行します。これはGOTのインデックス番号です。
5. jmp0x400440を実行します
6であり、0x4004400x400440はPLT [0]のアドレスです。
7. PLT [0]の命令は、ダイナミックリンカーの入り口に入ります。
8.関数を実行して、実際の関数アドレスをGOTテーブルに上書きします

初めて呼び出される関数のプロセスグラフ:




最初のステップでは、関数呼び出しがPLTテーブルにジャンプし、次に2番目のステップでPLTテーブルがGOTテーブルにジャンプします。 3番目のステップで、GOTテーブルがPLTテーブルにジャンプして戻ることがわかります。このとき、スタックをプッシュし、スタック上の関数を表すIDをプッシュしてから、4番目のステップでパブリックPLTエントリにジャンプし、5番目のステップでGOTテーブルに入り、_dl_runtime_resolveアドレス解決と動的関数の再配置を行います。 、7番目のステップでは、動的関数の実際のアドレスをGOTエントリに書き込み、関数を実行して戻ります。

この関数は、プロセス図の後に呼び出されます。


関数が呼び出された後:最初のステップは関数呼び出しからPLTテーブルにジャンプしますが、今回はエントリがすでに動的であるため、2番目のステップはGOTテーブルにジャンプします。直接実行されてから返されます。
動的関数の呼び出しの場合、アドレス解決とGOTテーブルエントリへの最初の書き戻し、および2回目の直接呼び出し。