Kimura Fuyuki
fuyuk****@nigre*****
2004年 2月 14日 (土) 16:23:47 JST
At Thu, 12 Feb 2004 17:29:04 +0900, Kimura Fuyuki <fuyuk****@nigre*****> wrote: > > どうやら手元の環境(FreeBSD/gcc-3.3.3)に問題がありそうな気配です。 向こうで話をしてみたのですが、時間がかかりそうな気配なので、こっちにも 流しておきます。 添付のテストプログラムを実行してみてください。環境によって結果がAとBに 分かれます。問題なのはAのほうで、私にはこれはセキュリティやモジュラリ ティの面で非常にまずいように思われます。 具体的に言えば、ある共有ライブラリがfoo()とbar()を提供しているとして、 barがfooを呼んでいる場合、実はfooはbarを呼ぶユーザーの側で自由に置き換 えることが可能です。(fooがcheck_passwordで、barがnanka_sugoi_kotoだと したら?) しかしなぜか実装の趨勢はBからAのほうへ向かっているようで、新しい環境ほ どAになりやすい気がします。 どうも http://gcc.gnu.org/faq.html#dso で説明されているC++の問題の対策を打ったときに間違えたのではないかとい う気がしてならないのですが、私にはよくわかりません。このへん詳しい方が いたらぜひ解説をお願いします。 -- 木村 冬樹 #!/bin/sh # BSDはこれでOKのはず LIBS="-lm" # Linuxならこうかも #LIBS="-lm -ldl" # あとは知らん cat <<'[EOF]' >fakem.c double sin(double d) {return 1;} double sin_wrapper(double d) {return sin(d);} [EOF] cat <<'[EOF]' >dltest.c #include <stdio.h> #include <dlfcn.h> int main(void) { void *h; double (*sin_wrapper)(double); h = dlopen("./fakem.so", RTLD_LAZY); sin_wrapper = dlsym(h, "sin_wrapper"); return sin_wrapper(0); } [EOF] cc -shared -o fakem.so fakem.c cc -o dltest dltest.c $LIBS if ./dltest; then echo "A) あなたは呪われています。" else echo "B) あなたは呪います。" fi