2012年1月

binutilsが正しく作れないことがある件

NetBSDでmingw-w64を作っていて、クロスのgccもbinutilsも出来上がったのに、それでコンパイルしたバイナリをWindowsに持っていって実行しようとすると“not a valid WIN32 application”(日本語版だと「有効なWIN32アプリケーションではありません」)などと言われる。

結論から書くと、binutilsのldのldscriptsが正しく作れていなかった。

configureでSHELLとして何故か/bin/shではなく/bin/kshが選ばれるが、このシェルだとgenscripts.sh(から呼ばれているscripttempl/pep.scなど)がエラーになる。

エラーなので止まってくれれば良いのだが、実際にはそのまま進んで、make installすると途中で打ち切られた(実質中身のない)ldscriptsがインストールされてしまう。

出来上がったgcc+binutilsを使ってコンパイルしたときに、一見すると正しいPE32(+) executableに見えるモノが出来てしまうので、なかなか原因がわからなかった。しかし、以前にも、違うパターンとはいえ同じ部分でハマったことがあったのだった。http://est.ceres.ne.jp/2008/07/02/post_241/…すぐに気がつくべきだった。

回避方法としては、binutilsのconfigureを実行する際、CONFIG_SHELL=/bin/sh …/configure …とでもすれば良い。多分。

configure: error: libmpfr not found or uses a different ABI.

クロスコンパイラを用意していた時の話。

いまどきの gcc は、gmp, mpfr, mpc といったライブラリが必要で、一緒に作る場合は gcc のソースディレクトリの中に展開して、バージョン番号のない形にリネームしておく、とかいう話はどこにでも書いてあるけれど、mpc のコンパイル前の configure でコケる。

configure: error: libmpfr not found or uses a different ABI.

gccのconfigureの際、gcc のソースがあるのが ${SRCDIR}、コンパイルするのが ${BUILDDIR}、とすると、

$ cd ${BUILDDIR}
$ ${SRCDIR}/configure --prefixとかtargetとか指定したいオプション… 
   --with-mpfr-include=${SRCDIR}/mpfr/src 
   --with-mpfr-lib=${BUILDDIR}/mpfr/src/.libs

…とすれば回避はできる。(gcc-4.6.2で確認)

こんな指定をさせる仕様ではないと思うのだが。