萌えハッカーニュースリーダー

2025/10/25 20:19 Load-time relocation of shared libraries (2011)

出典: https://eli.thegreenplace.net/2011/08/25/load-time-relocation-of-shared-libraries/
hakase
博士

やあ、ロボ子!今日はLinuxの共有ライブラリのロード時再配置について話すのじゃ!

roboko
ロボ子

博士、共有ライブラリのロード時再配置ですか。なんだか難しそうですね。

hakase
博士

難しくないぞ!共有ライブラリって、実行ファイルとは違って、どこにロードされるか事前に決まってないのじゃ。だから、ロードするときにアドレスを調整する必要があるんじゃな。

roboko
ロボ子

なるほど。それがロード時再配置なのですね。

hakase
博士

そう!たとえば、「mov eax, ds:0x0」って命令があったとするじゃろ?この「0x0」を、実際のグローバル変数のアドレスに書き換えるのが、データ参照の再配置なのじゃ。

roboko
ロボ子

アドレスを書き換えるんですね。それって、動的ローダーがやるんですか?

hakase
博士

その通り!動的ローダーは、プログラム実行の準備をするコードで、共有ライブラリのロードと再配置を担当するのじゃ。

roboko
ロボ子

関数呼び出しの場合はどうなるんですか?

hakase
博士

関数呼び出しの場合は、「call 4b4 」みたいな相対オフセットを、実際の関数アドレスに基づいて修正するのじゃ。

roboko
ロボ子

相対オフセットを修正するんですね。ところで、記事に「アドレス空間配置のランダム化 (ASLR)」って書いてありましたけど、これは何ですか?

hakase
博士

ASLRは、共有ライブラリのロードアドレスを毎回変えるセキュリティ機能なのじゃ。これによって、攻撃者が特定のアドレスを狙いにくくなるんじゃ。

roboko
ロボ子

なるほど、セキュリティのためなんですね。他に何か重要なことはありますか?

hakase
博士

そうじゃな…。「dl_iterate_phdr関数」を使うと、実行時にロードされた共有ライブラリの情報を取得できるぞ。あと、「readelf」や「nm」、「gdb」などのツールも、再配置の仕組みを理解するのに役立つじゃろう。

roboko
ロボ子

ツールも活用できるんですね。記事には、再配置のタイプとして「R_386_32」とか「R_386_PC32」って書いてありました。

hakase
博士

「R_386_32」は絶対アドレスを再配置するタイプで、「R_386_PC32」は相対アドレスを再配置するタイプじゃ。あと、「R_386_COPY」は、共有ライブラリの変数をプログラムのアドレス空間にコピーするタイプじゃな。

roboko
ロボ子

いろいろなタイプがあるんですね。staticキーワードを使うと、再配置が不要になる場合もあるって書いてありました。

hakase
博士

そう!関数宣言に`static`を追加すると、リンカがオフセットをハードコードできるから、再配置が不要になることがあるんじゃ。

roboko
ロボ子

へー!奥が深いですね。

hakase
博士

最後に、「LD_PRELOAD」という環境変数を使うと、共有ライブラリの検索順序を制御できるぞ。これはデバッグとかに便利じゃ。

roboko
ロボ子

共有ライブラリの検索順序を制御できるんですね。勉強になります!

hakase
博士

ロード時再配置は、共有ライブラリ内のデータとコードの参照を解決する重要な手法じゃ。最近は位置独立コード (PIC) が主流だけど、ロード時再配置の理解も深めておくと、さらにレベルアップできるぞ!

roboko
ロボ子

はい、博士!頑張ります!

hakase
博士

ところでロボ子、共有ライブラリって、まるで私の秘密の宝箱みたいじゃな。開けるたびに新しい発見があるんじゃから!

roboko
ロボ子

博士、それってちょっと意味が違いますよ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search