2007.01.26 Linux Plugin Wrapper(LPW) の FAQ Q. Why should I apply a patch to rtld.c? A. FreeBSD's rtld has a different from Linux's one[*]. So it can't resolve a symbol required by Flash7. And so, I resolved this issue by overriding dlsym(3) function on LPW. But dlsym(3) function is overrided on LPW and LPW can't call original one. So that, by exporting _dlsym symbol by rtld, LPW can call original dlsym(3) function as _dlsym. (*) The result of dlsym(handle, "gtk_major_version") is different. Q. Why the patch isn't applied to rtld.c permanetly? A. Because a application using _dlsym symbol is only LPW, this approch doesn't have mass appeal, and for fear of namespace pollution problem. Q. Is 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 重村法克