2006.01.01.ext1 LPWにモノ申す LPWネタについてちょこまか書いて行こうかと。 LPW。言わずと知れた(?) OS ネイティブのバイナリから 他の OS のバイ ナリを呼び出しても, 動かしてしまうグルーソフトウェアである。もち ろん無条件には呼び出せないのでいくつか制限(仕様)がある。 1. ELF バイナリであること FreeBSD から Windows のバイナリは呼べない。win32-codecs ネタ は極めて限定条件だからできるのであって, 汎用的にはいかんとも しがたい。やろうとも思いませんが。 2. ABI がほぼ一致すること amd64 (アーキテクチャ)から i386 (アーキテクチャ)用のプラグ インが呼べないかという問い合わせがありますが, Microsoft だ って匙を投げてるのでやらない。断固としてやらない。 関数コールのルールが一致してないとアセンブリ言語レベルで調 整しないといけないので, あまりにもホスト側の ABI(まぁ具体 的には FreeBSD だが)と違うのも問題である。幸い Linux 向けと しょうしてそこそこバイナリはあるので, その当たりがターゲッ トになる。 ホスト: FreeBSD ターゲット: Linux 3. FreeBSD のブラウザから Linux のプラグインを使用することが 目的のほぼ全てである(爆) よってここでの議論はブラウザからプラグインが呼べるか。がテ ーマとなる(爆)。pips, java3d ユーザーには申し訳ない(^^;。 更に言うとブラウザは firefox, プラグインは flash7 である。 さらに言うと DragonflyBSD で稼働してるし, 原理的には NetBSD/ OpenBSD でも動く。ここでは見なかったことにしておく。 ホスト: firefox ターゲット: flash7 □仕組み firefox から dlopen(3) された flash7 が参照解決を行う際(参照 解決を行うのは rtld(1) だが), LPW の関数群が F のライブラリ に代わっておしおきよ。ではなく, 代わって呼び出しを受け, F の 相当するライブラリを呼び出す。というのが処理の本質である。 更に返って来た戻り値を適応させるわけだが, LPW のお仕事は, L → F, F → L の変換を行うことにある。 □何が大変か 1. 乗っ取りが大変 libmap.conf のおかげでだいぶ簡単に乗っ取れるようになりまし がた, 極めてアトミックなレベル, つまり参照解決を行う箇所で の乗っ取りが完全ではありません。 これは, 絶対呼ばれてるであろう関数がフックできないことから もうかがい知れます。 2. デバッグが大変 デバッグトレースが事実上できないので(バイナリが巨大すぎる, 通り過ぎる箇所が複雑で多い等), 本質的に安定させるのが難しい。 3. rtld(1)の動作メカニズムがよくわかってない(爆) 参照解決のメカニズムをコントロールできれば 1 の問題が解決 できそうではあるけど, よーわからん。というのが正直なとこ ろ。。 4. 結局 dummy.c で flash7 が外部に参照している関数一覧をハイ ジャック(呼ばれたことを write(2) して, abort(3)する)する しかないという。。 まぁ後は ELF symbol versioning 対応の時にでも。。。 Written by 重村法克