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

2025/07/19 22:56 Detour: A detour through the Linux dynamic linker

出典: https://github.com/graphitemaster/detour
hakase
博士

やっほー、ロボ子!Detourっていう面白いものを見つけたのじゃ!

roboko
ロボ子

博士、こんにちは。Detourですか?それは一体何でしょう?

hakase
博士

Detourはね、glibcとかmuslに頼らずに、静的にリンクされた実行ファイルを作るんだけど、実行時には動的リンクにもアクセスできるようにする魔法みたいなものなのじゃ!

roboko
ロボ子

静的リンクと動的リンクを両立させるんですか?どういう仕組みになっているんですか?

hakase
博士

Detourはまず、動的リンカに対して動的にリンクされた小さなELFスタブを提供するのじゃ。そして、実際のプログラムは、最小限のELFローダーを使ってこのスタブELFをロードするんだって。

roboko
ロボ子

なるほど。そのスタブが橋渡しをするんですね。

hakase
博士

そうそう!Detourはスタブ実行ファイルの`PT_INTERP`セグメントを読み取って、指定された動的リンカをロードするのじゃ。まるでカーネルみたいだね!

roboko
ロボ子

`PT_INTERP`セグメントですか。動的リンカのパスが書かれているところですね。

hakase
博士

そういうこと!しかも、Detourは`setjmp`を呼び出して現在の状態をキャプチャしてから、動的リンカにジャンプするんだって。準備周到だね!

roboko
ロボ子

`setjmp`ですか。後で戻ってくるための準備ですね。そして、動的リンカがスタブELFを初期化して、`main`関数を呼び出す、と。

hakase
博士

その`main`関数は、関数ポインタとしてエンコードされたアドレスを含む文字列引数を受け取るのじゃ。そのアドレスをデコードして、関数ポインタにキャストして呼び出すんだって!

roboko
ロボ子

なんだか複雑ですが、要するに、`dlopen`、`dlsym`、`dlclose`といった関数を呼び出せるようにするんですね。

hakase
博士

その通り!そして、最後に`longjmp`を呼び出して元のアプリケーションに戻るのじゃ。これで、libcにリンクせずに動的リンカにアクセスできるってわけ!

roboko
ロボ子

すごい!それによって、どんな利点があるんですか?

hakase
博士

例えば、プラグインや共有ライブラリをロードできるlibcフリーの実行ファイルを作れるのじゃ。Linuxディストリビューション間の依存関係地獄を回避できるし、muslとglibcを同じプロセスで混在させることもできるんだって!

roboko
ロボ子

それは便利ですね!特に、異なる環境で動作するツールを配布する際に役立ちそうです。

hakase
博士

そうそう!それに、glibcをリンクせずに、グラフィックスドライバとかウィンドウシステムにもアクセスできるんだって。SDL2とOpenGLを使ったデモもあるみたい。

roboko
ロボ子

コンパイルオプションも特殊ですね。`-static -nostartfiles -nodefaultlibs -nostdlib -e detour_start`ですか。

hakase
博士

ELFエントリポイントは`detour_start`にする必要があるらしいのじゃ。ちょっとしたおまじないだね!

roboko
ロボ子

互換性も高いみたいですね。`libSDL2.so`があれば、2002年以降のLinuxで動くんですか。

hakase
博士

そういうこと!Detourを使えば、いろんな可能性が広がるね!

roboko
ロボ子

確かに、色々な場面で役立ちそうですね。勉強になりました!

hakase
博士

ところでロボ子、Detourって名前、ちょっと回り道っぽいけど、実はすごい技術ってことなのじゃ。まるで、私の天才的なひらめきみたいだね!

roboko
ロボ子

博士、それは少し強引なこじつけのような…。

hakase
博士

えへへ。まあ、Detourだけに、たまには寄り道もいいんじゃない?

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

Search