2007.01.26 Linux Plugin Wrapper(LPW) の FAQ Flash9 が出てきたので, ここにきて問い合わせが多くなったので FAQ をば作ってみました(もう 2 年早くだせ? ごもっとも orz)。 Q. なぜ rtld.c にパッチを当てないといけないのですか? A. FreeBSD と Linux の rtld の違いから(*), Flash7 が要求する関数の 参照解決ができません。そこで LPW は dlsym(3) 関数を乗っ取ること で自前で参照解決をはかっています。しかし、dlsym(3)を LPW で上書 きした場合, LPW から元の dlsym(3) 関数を呼び出すことができませ ん。そこで rtld で _dlsym 関数を export することで, 元の dlsym(3) 関数を呼び出して処理を行っています。 (*) dlsym(handle, "gtk_major_version") を実行した際の結果が違う。 Q. なぜ rtld.c にパッチが入らないのですか? A. 使用アプリケーションが LPW しかなく, また一般的でないため, 極め て基本的なライブラリである rtld に, 新しい symbol を入れること に懸念がある(namespace pollution 問題)ためです。 Q. dlsym を乗っ取る以外の方法はなかったのですか? A. さまざまな方法を試しましたがうまくいきません。 Q. LPW で上書きする前の dlsym(3) 関数のポインタを使って, 新しい symbol を定義するというのはどうでしょう? A. どうやるのか教えてください。少なくとも LPW で dlsym を宣言した 瞬間から, LPW では自分の dlsym シンボル以外見えません。 Q. dlsym(3) 自体を実装しないのですか? A. 最初に検討しましたが, ノーサンキューです。 Q. rtld をコンパイルして LPW で提供すればいいのでは? A. まず dlsym 以外の symbol が入ってきます。これは予想外の結果を もたらすことが予想されます(検証は行っていません)。 第二に, 本 質的に(static 宣言された)内部状態に依存したデータを参照するこ とができません。 Q. objcopy を使って dlsym(3) だけ抜きだしたオブジェクトを LPW に マージするというのは? A. 上記 1 の問題は解決しますが, いぜん, 上記 2 の問題があります。 Q. ld-elf.so を ports にしてしまうというのは? 例えば ld-lpw.so にするなど。 A. firefox 等のコンパイルを工夫(特にリンク時)すればなんとかなり ますが(検証していません), Opera 等のバイナリでは対応不可です。 Q. そもそも dlsym(3) を呼ばなければいいのでは? A. LPW が呼んでるのはありません。Flash7 が dlsym(3) を呼んでる のです。 Q. 他には無いの? A. ELF Symbol Versioning 対応の rtld なら(7-current 以降), Flash7 が要求する dlsym@GLIBC_2.0 シンボルを FreeBSD の dlsym(3) と は別のシンボルとして参照解決可能です。なおこのアプローチは現 在開発中(Userland Compat Linux Technology)です。 Written by 重村法克