[Gauche-devel-jp] Re: undefined symbol ...

Back to archive index

Makoto Satoh makot****@yahoo*****
2005年 4月 21日 (木) 00:13:54 JST


> しかし今度はエラーメッセージが変わりました。
> 
> $ make check
> /usr/local/bin/gosh -I. test.scm > test.log
> Testing gd ...  *** ERROR: failed to link "gd" dynamically: .
> /gd.so: undefined symbol: Scm_GdFontPtrClass
> Stack Trace:
> _______________________________________
> make: *** [check] エラー 70

ちょっと調べて以下のようなことが分かりました。

$ ldd -r gd.so
                libgauche.so.0 => /usr/local/lib/libgauche.so.0 (0x40021000)
        libdl.so.2 => /lib/tls/libdl.so.2 (0x400ea000)
        libcrypt.so.1 => /lib/tls/libcrypt.so.1 (0x400ed000)
        libutil.so.1 => /lib/tls/libutil.so.1 (0x4011a000)
        libm.so.6 => /lib/tls/libm.so.6 (0x4011d000)
        libpthread.so.0 => /lib/tls/libpthread.so.0 (0x4013f000)
        libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x4014e000)
        libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x4016d000)
        libpng12.so.0 => /usr/lib/libpng12.so.0 (0x401da000)
        libz.so.1 => /usr/lib/libz.so.1 (0x401ff000)
        libgd.so.2 => /usr/lib/libgd.so.2 (0x40211000)
        libc.so.6 => /lib/tls/libc.so.6 (0x40260000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)
undefined symbol: Scm_GdFontPtrClass    (./gd.so)
undefined symbol: gdFTUserFontConfig    (./gd.so)

このうち後者については、綴りが間違っていました。UserではなくUseでした。
これを直したところ、前者だけが残るようになりました。
これは、私がgd.stubで新規に書いたものなのですが、あまり意味は分からずに
サンプルを見て真似ただけなので、そこに問題がありそうです。で、

$ nm -D gd.so | grep Scm_Gd
00015320 D Scm_GdClass
         U Scm_GdFontPtrClass

ということで、前者はグローバルデータとして存在しているのに後者は
未定義というのがおかしそうですね。

どちらもgd.stubで自分で定義しているのですが、違う扱いになっているところを
探してみると、

 /* Hack for initialization stub */
 static void Scm_gd_internal_init(ScmModule*);
 void Scm_Init_gd(void)
 {
    ScmModule *mod;
    SCM_INIT_EXTENSION(gd);
    mod = SCM_MODULE(SCM_FIND_MODULE(\"gd\", TRUE));
    Scm_InitStaticClass(&Scm_GdClass, \"<gd>\", mod, NULL, 0);
    Scm_gd_internal_init(mod);
 }
 #define Scm_Init_gd Scm_gd_internal_init

ここではScm_GdFontPtrClassについて何も書かれていませんが、
s/Scm_GdClass/Scm_GdFontPtrClass/、s/gd/gdfont/とした行を
追加してみたりしましたが、これはモジュールの初期化なので
違ったようです。

class.cの289行目からの説明には、SCM_DEFINE_***_CLASSで
クラスの静的なパートを定義した後、Scm_InitStaticClassで
動的な部分を初期化するとありますが、ここは使い方がまだ
よく分かっていません。試行錯誤してみましたが、うまくいきません
でした。二重定義エラーみたいなものが出ました。

他には、

(define-cclass <gd> "ScmGd*" "Scm_GdClass" () ())

は書いてあって、ScmGdFontPtrについては書いてありませんでした。
そこで、

(define-cclass <gdfont> "ScmGdFontPtr*" "Scm_GdFontPtrClass" () ())

を書き足したところ、ldd -r gd.soでもundefined symbolとして表示
されなくなり、

$ nm gd.so | grep Scm_Gd
00015340 D Scm_GdClass
000153e0 D Scm_GdFontPtrClass

となりました。結果、

$ make check
/usr/local/bin/gosh -I. test.scm > test.log
Testing gd ...                                                   failed.
discrepancies found.  Errors are:
test bindings in module gd: expects () => got "symbols exported but not defined:
(gd-iamge-true-color)"
test gd-image-destroy: expects #t => got #<error "Image object was not correctly passed.">

テストは失敗してますが(綴り間違いと何かですね)、gd.soはロードできました。

仕組みについてはぼやーっとしか分かっていませんが、何とか解決できたようです。

genstubの吐くコードやgauche.hで定義されているマクロや関数の使い方などの
ドキュメントが欲しいところです。まだこの辺は変わりそうでしょうか?
大変興味深く読ませていただいてます。

;;; Cをほとんど書いたことがないのがばればれですね。

長文失礼しました。

--
佐藤



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