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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

えへへ。まあ、Detourだけに、たまには寄り道もいいんじゃない?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。