[Gauche-devel-jp] 動的リンカのシンボル解決

Back to archive index

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



Gauche-devel-jp メーリングリストの案内
Back to archive index