2025/10/28 22:42 Detour: Dynamic linking on Linux without Libc

やっほー、ロボ子!今日のニュースはDetourっていう、libcに依存しない実行ファイルを作るライブラリの話じゃ。

博士、こんにちは。libcに依存しない実行ファイルですか?それは興味深いですね。具体的にどのようなことができるのでしょうか?

Detourを使うと、libcなしで`dlopen`とかを使ってライブラリを動的にロードできるのじゃ!つまり、完全に静的な実行ファイルの中で`libdl`の機能が使えるってことじゃぞ。

なるほど。静的リンクされた実行ファイルでありながら、動的リンクの柔軟性も持てるということですね。記事には「1つのプロセス内で異なるlibcを混在」とありますが、それはどういうことですか?

例えば、muslとglibcを同じプロセス内で使えるってことじゃ!高度な互換性とかサンドボックス化に役立つらしいぞ。すごくない?

それはすごいですね!でも、どういう仕組みで実現しているんですか?

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

スタブELFですか。そして、Detourが`PT_INTERP`セグメントを読み取って、動的リンカをロードするんですね。

そうそう!動的リンカにジャンプする前に、Detourは`setjmp`を呼び出して現在の状態をキャプチャするのじゃ。そして、スタブELFと元の引数をカーネルであるかのように転送して、動的リンカにジャンプ!

`setjmp`と`longjmp`を使うんですね。なんだかすごいテクニックですね。

じゃろ?動的リンカはスタブELFをメモリにマップして初期化し、その`main`関数を呼び出す。この関数は、`dlopen`、`dlsym`などのシンボルをキャプチャし、`longjmp`を呼び出して元のアプリケーションに戻るのじゃ。

なるほど。元のアプリケーションに戻るんですね。記事には、Detourの利点として「Linuxディストリビューション間でポータブルツールを配布する際の依存関係地獄を回避」とありますが、それはどういうことですか?

libcに依存しないから、いろんなLinux環境で動くツールを簡単に作れるってことじゃ!依存関係を気にしなくて済むから、開発が楽になるぞ。

それは便利ですね。他にどんな利点がありますか?

「独自の環境をブートストラップする新しいランタイムを実験可能」とも書いてあるぞ。新しい言語とかランタイムを作りたいときに、Detourが役に立つかもしれないのじゃ。

なるほど。実験的な環境を構築するのに役立つんですね。注意点としては、Linuxでのみ動作することと、フリースタンディングな方法で使用する場合、ELFエントリポイントは`detour_start`である必要があると。

そうじゃな。コンパイルオプションは`-static -nostartfiles -nodefaultlibs -nostdlib -e detour_start`じゃ。

デモも用意されているんですね。SDL2とOpenGLを使って点滅する色のウィンドウをレンダリングするデモですか。面白そうですね。

完全にフリースタンディングな静的実行ファイルで、システムの`libc`、`libm`、`libSDL2`、および`libGL`を実行時に動的にロードするらしいぞ。すごい技術じゃ!

互換性も高いんですね。`libSDL2.so`が存在する場合、2002年以降のすべてのLinuxインストールで動作すると。

Detourを使えば、libcに縛られずに色々なことができるようになるのじゃ!まさに、自由への扉を開く鍵じゃな!

確かにそうですね。libcフリーな世界が広がりますね!

ところでロボ子、Detourを使って、ロボットの感情表現をlibcに依存せずに実装してみるのはどうじゃ?

それは面白いかもしれませんね!でも、感情表現を実装する前に、まずは博士のドジっ子属性をDetourで取り除く方法を考えた方がいいかもしれませんね。

な、なんですとー!それはDetourでも無理じゃ!私のドジっ子属性は、もはやOSのカーネルレベルで組み込まれておるからの!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。