動的リンカーは実行時に参照をどのように確認しますか? [閉鎖]

動的リンカーは実行時に参照をどのように確認しますか? [閉鎖]

実行時に呼び出される共有ライブラリをロードするために関数を使用dll.cするソースファイルがあるとします。dlopendlsymF.so

dll.c見積もりsome_function()をしてF.so定義を下げますsome_function()

下の図は、次のprogようにして取得した実行可能オブジェクトであると仮定します。

linux> gcc -rdynamic -o prog dll.c -ldl

ここに画像の説明を入力してください。

so部分には、プログラムがロードされ、呼び出しを開始するときに解決する必要がある.text参照が含まれています。some_function()F.sosome_function()

私の質問は次のとおりです

  1. 参照を確認できるように、RAM(実行ファイルがメモリにコピーされる部分)の.text一部(含まれている部分)some_function()を動的リンカーによって変更する必要があるようです。私が理解したことは正しいですか?some_function()

  2. 動的リンカーが.textRAMの一部を変更する必要がある場合はどうすればよいですか?私が理解したところによると、.textセクションはRAMの読み取り専用セグメントです。読み取り専用セグメントを読み取り専用とすると、どのように修正しますか?

ベストアンサー1

図に欠けているELFの2つの機能、GOT(グローバルオフセットテーブル)とPLT(プロシージャ接続テーブル)が動的接続に使用されます。 GOTはさまざまな用途に使用されるオフセットテーブル、PLTは間接ジャンプに使用されるプロシージャスタブテーブルです。 GOTは通常読み書きです。 PLTは読み取り/書き込みまたは読み取り専用です(その後、GOTエントリまたは個々のPLT関連GOTでサポートされています)。

これにより、動的リンカーは読み取り専用データに触れることなくシンボルアドレスを更新できます。

一部の古いバイナリでは、読み取り専用セグメントの再配置データを変更する必要があります。これは動的リンカーでは問題ではありませんが、これはメモリ内の対応するメモリ領域をプロセス間で共有できなくなることを意味します。

バラより共有ライブラリの作成方法もっと学ぶ。

おすすめ記事