CygwinでLLVMのlliが動かない(その1)
Linux (Debian Lenny)では"Hello World"が動くのを確認できた。
まー、これでLinux上で遊べばいいのだが、やっぱりCygwinで動かないのは気になる。
再現率は100%だし、数日前に、「ソースコードを快適に読むための GNU GLOBAL 入門 (前) (中) (後)」なんてのを読んだのもあって、C++をほとんど知らんにもかかわらず、いきなり追跡モードに。
まず、
> lli test/ExecutionEngine/hello.bc ERROR: Program used external function 'puts' which could not be resolved! Aborted
が出る原因は、「http://d.hatena.ne.jp/jmax/20090311/p1」のコメントに書かれていた通り、dlopenのライブラリ名にNULLが渡されると正常に動作しないこと。細かいことを言うと、CygwinのdlopenにNULLを渡すと、cygwin1.dllのものとは異なるよくわからないアドレスが返って来るようだ。
この問題を解消するには、DynamicLibrary::LoadLibraryPermanentlyで、FilenameがNULLならcygwin1.dllに置き換えるのが良いと思う。
で、この問題が解決すれば動くだろう、と思ったら……。
assertion "Inserted && "Pass registered multiple times!"" failed: file "Pass.cpp", line 149
orz よくわからんのでデバッガで追い掛けてみたのだが、やっぱりわからず。printfならぬcerrを突っ込んで検証してみると、lib/VMCore/PrintModulePass.cppの以下の行:
static RegisterPass<PrintModulePass> X("print-module", "Print module to stderr");
が2回実行されて落ちているらしい。ちょっと待て、static!? 何故2回実行されるんだ。
というところまでで本日は時間切れだが、この問題、(スキル不足で)解消できなさそーな気がしてきた……。