[[diary/Kojima]]

・LLVM-3.3 on Plamo-5.1/i586(その3)

当然ながら,crtbegin.oもシステム上は存在している.

 $ ls -l /usr/lib/gcc/i586-pc-linux-gnu/4.6.3/crtbegin.o 
 -rw-r--r-- 1 root root 1,632  4月 18日 2012年 /usr/lib/gcc/i586-pc-linux-gnu/4.6.3/crtbegin.o

GCCだと,crtbegin.oの位置は-Bオプションで指示できたっけ,,と思って,
試してみたら,LLVMでもこのオプションは効くようで,crtbegin.oは見つけたものの,今度は-lgcc が
解決できなくてエラーになる.

 $ clang++ -v  test.cpp -I/usr/include/c++/4.6.3 -I/usr/include/c++/4.6.3/i586-pc-linux-gnu \
       -B/usr/lib/gcc/i586-pc-linux-gnu/4.6.3/ 
 clang version 3.3 (tags/RELEASE_33/final)
 Target: i386-plamo-linux-gnu
 Thread model: posix
 ...
  "/usr/bin/ld" --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o a.out 
     /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc/i586-pc-linux-gnu/4.6.3/crtbegin.o 
     -L/lib -L/usr/lib /tmp/test-oJXAvV.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s 
     -lgcc /usr/lib/gcc/i586-pc-linux-gnu/4.6.3/crtend.o /usr/lib/crtn.o
 /usr/bin/ld: cannot find -lgcc
 clang-3.3: error: linker command failed with exit code 1 (use -v to see invocation)

/usr/lib/には libgcc_s.so.1 という共有ライブラリはあるものの,
エラーになっているのは -lgcc なので,このライブラリとは異なるらしい.-lgcc で
リンクするようなライブラリってあったっけ,,調べてみたところ,
GCCが内部的に使っているライブラリらしい.

 $ grep libgcc /var/log/packages/*
 /var/log/packages/gcc:usr/lib/gcc/i586-pc-linux-gnu/4.6.3/libgcc_eh.a
 /var/log/packages/gcc:usr/lib/gcc/i586-pc-linux-gnu/4.6.3/libgcc.a
 /var/log/packages/gcc:usr/lib/libgcc_s.so.1
 /var/log/packages/gcc:usr/lib/libgcc_s.so

じゃぁ,このディレクトリも指示してやればいいのか,と-Lオプションを追加してみると,
ようやくビルドが通った.

 $ clang++ -v  test.cpp -I/usr/include/c++/4.6.3 \
      -I/usr/include/c++/4.6.3/i586-pc-linux-gnu \
      -B/usr/lib/gcc/i586-pc-linux-gnu/4.6.3/ \
      -L/usr/lib/gcc/i586-pc-linux-gnu/4.6.3
 clang version 3.3 (tags/RELEASE_33/final)
 Target: i386-plamo-linux-gnu
 Thread model: posix
  "/usr/bin/clang-3.3" -cc1 -triple i386-plamo-linux-gnu -emit-obj 
     -mrelax-all -disable-free -disable-llvm-verifier -main-file-name test.cpp 
     -mrelocation-model static -mdisable-fp-elim -fmath-errno -masm-verbose 
     -mconstructor-aliases -target-cpu pentium4 -v 
     -resource-dir /usr/bin/../lib/clang/3.3 -I /usr/include/c++/4.6.3 
     -I /usr/include/c++/4.6.3/i586-pc-linux-gnu -internal-isystem /usr/local/include 
     -internal-isystem /usr/bin/../lib/clang/3.3/include 
     -internal-externc-isystem /include -internal-externc-isystem /usr/include 
     -fdeprecated-macro -fdebug-compilation-dir /mnt/Srcs/L/LLVM -ferror-limit 19 
     -fmessage-length 90 -mstackrealign -fobjc-runtime=gcc 
     -fobjc-default-synthesize-properties -fcxx-exceptions -fexceptions 
     -fdiagnostics-show-option -backend-option -vectorize-loops -o /tmp/test-IFtGk9.o 
     -x c++ test.cpp
 clang -cc1 version 3.3 based upon LLVM 3.3svn default target i386-plamo-linux-gnu
 ignoring nonexistent directory "/include"
 #include "..." search starts here:
 #include <...> search starts here:
  /usr/include/c++/4.6.3
  /usr/include/c++/4.6.3/i586-pc-linux-gnu
  /usr/local/include
  /usr/bin/../lib/clang/3.3/include
  /usr/include
 End of search list.
  "/usr/bin/ld" --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o a.out
     /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc/i586-pc-linux-gnu/4.6.3/crtbegin.o 
     -L/usr/lib/gcc/i586-pc-linux-gnu/4.6.3 -L/lib -L/usr/lib /tmp/test-IFtGk9.o 
     -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc 
      /usr/lib/gcc/i586-pc-linux-gnu/4.6.3/crtend.o /usr/lib/crtn.o
 $
 $ ./a.out
 Hello World!

とりあえずコンパイルできるようにはなったものの,
一々これらのオプションを指定しないと使えないってのはとても不便なので,
GCCみたいに環境変数で制御できないのだろうか,,と調べてみると,
ヘッダファイルのインクルードパスは CPLUS_INCLUDE_PATH という環境変数で
設定できる模様.

 $ export CPLUS_INCLUDE_PATH=/usr/include/c++/4.6.3:/usr/include/c++/4.6.3/i586-pc-linux-gnu
 $ clang++ -v test.cpp 
 clang version 3.3 (tags/RELEASE_33/final)
 Target: i386-plamo-linux-gnu
 ...
 clang -cc1 version 3.3 based upon LLVM 3.3svn default target i386-plamo-linux-gnu
 ignoring nonexistent directory "/include"
 #include "..." search starts here:
 #include <...> search starts here:
  /usr/include/c++/4.6.3
  /usr/include/c++/4.6.3/i586-pc-linux-gnu
  /usr/local/include
  /usr/bin/../lib/clang/3.3/include
  /usr/include
 End of search list.
 ... 
 /usr/bin/ld: cannot find crtbegin.o: No such file or directory

[[GCCのドキュメント:http://gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc/Directory-Options.html#Directory-Options]]によると,-Bの指定はGCC_EXEC_PREFIXと同等だそうだけど,
LLVMではこの環境変数は効かない感じ.

 $ export GCC_EXEC_PREFIX=/usr/lib/gcc/i586-pc-linux-gnu/4.6.3/
 $ clang++ test.cpp 
 /usr/bin/ld: cannot find crtbegin.o: No such file or directory
 clang-3.3: error: linker command failed with exit code 1 (use -v to see invocation)

とりあえず,C_INCLUDE_PATHとCPP_INCLUDE_PATHを設定して,
clang/clang++に-Bオプションを追加するようなラッパーでも書けば
何とかなりそうな感じにはなったものの,
64ビット側では問題ないのに,32ビット側だけ姑息な処理を追加するのもイマイチだなぁ,,と
何か別の解決方法が無いものか,さらなる調査が続くのであった(続く)

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS