勝手に作ったbinutilsの動作確認

さて昨日は、主にiconvを動的ライブラリにして、ダイエットしたbintils v2.22を作った訳だが、出来たは良いが動くかどうかか未知数なので評価してみた。

asとldの検証

アセンブラソースを1から書くのは面倒なので、ccに吐かせて見る。ソースも面倒なのでhello worldと日本語(MS932)の文字列表示だけだ。

$ cc -S -finput-charset=cp932 -fexec-charset=cp932 a.c
$ ls
a.c  a.s
$ /usr/local/bin/as.exe a.s -o a.o 
$ ls
a.c  a.o  a.s
$ /usr/local/bin/ld.exe /mingw/lib/crt2.o \
/mingw/lib/gcc/mingw32/4.6.2/crtbegin.o \
a.o /mingw/lib/gcc/mingw32/4.6.2/crtend.o \
-L/mingw/lib -lmingw32 -lkernel32 -lmsvcrt
$ a.exe
Hello World!!
ファイル構成

う〜ん、久々にldのスタートアップオブジェクトとライブラリ書いたぞ。あっ、ちなみに、これはprintf()しか使っていないときのサンプルなので、他の関数を使っていると、色々と追加ライブラリが必要になってくるので、ご注意を。
取りあえずasは問題なくコードを吐いているし、ldは他オブジェクトファイルとライブラリのリンクに成功しているので、問題なく動作していると判断出来るでしょう。

windresの検証

iconvの影響を一番受けるとしたらwindresでしょう。なぜなら、リソースファイルからUNICODE文字列のオブジェクトファイルを生成するのだからね。
と言うわけで、MS932とUTF-8のリソースファイルを作って、windresに通してみた。結果から言うとどちらも問題なくUNICODEに変換され、windows実行ファイルは文字化けしなかった。てな訳で、こちらも問題なく動作していると判断出来るでしょう。

結果と後片付け

面倒な人は、そのままMinGWから提供されるサイズの大きいものを使う。多少暇な人は、GNU Projectから拾ってきて自分で作りサイズを切り詰める。

さて、このままだと/usr/localの下に無駄なものが存在する事になるので、削除しなければなりません。残念なことにv2.22のbinutilsのmakeファイルは、インストールしたものを削除することを考慮してくれていないので、手動で消さなければなりません。願わくば/usr/local/を使っていないことを祈ります。ちなみに削除対象は以下の通りです。後々、不具合を抱えることになるので、少なくとも/usr/local/binの中だけは消してください。

/usr/local/bin
addr2line.exe, ar.exe, as.exe, c++filt.exe, dlltool.exe, dllwrap.exe, elfedit.exe, gprof.exe, ld.bfd.exe, ld.exe, m.exe, objcopy.exe, objdump.exe, ranlib.exe, readelf.exe, size.exe, strings.exe, strip.exe, windmc.exe, windres.exe
/usr/local/include
ansidecl.h, bfd.h, bfdlink.h, dis-asm.h, symcat.h
/usr/local/lib
libbfd.a, libbfd.la, libiberty.a, libopcodes.a, libopcodes.la
/usr/local/mingw32
このディレクトリの配下すべて削除
/usr/local/share/info
as.info, bfd.info, binutils.info, configure.info, gprof.info, ld.info, standards.info
/usr/local/share/locale
面倒なので消さないで良いかも
/usr/local/share/man/man1
addr2line.1, ar.1, as.1, c++filt.1, dlltool.1, elfedit.1, gprof.1, ld.1, nlmconv.1, nm.1, objcopy.1, objdump.1, ranlib.1, readelf.1, size.1, strings.1, strip.1, windmc.1, windres.1

binutils v2.23.2のインストール

MinGWにはありませんが、GNU Projectにはbinutils v2.23.2が公開されています。調子に乗ってこれをコンパイル、インストールしてみます。サイズの問題からbinutils-2.23.2.tar.bz2を拾ってきます。昔はbzip2のコマンド使ったり、オプション指定したりと面倒でしたが、最近はtarがマジックナンバーを意識してくれるようなので、楽が出来ます。あと、--disable-nlsは、中途半端な日本語を表示させないオプションです。

$ tar xf binutils-2.23.2.tar.bz2
$ mkdir build
$ cd build
$ ../binutils-2.23.2/configure --build=mingw32 \
--prefix=/MinGW --disable-shared --enable-static --disable-nls \
--with-libiconv-prefix=disable --with-libintl-prefix=disable
$ make all
$ make install-strip