MinGWのbinutilsが大きい件について

UTF-8と戯れるのもいい加減飽きてきたので、少し脱線。MinGW-Base-binutilsをアップデートしようとしたが、気がつくと最新パッケージのサイズが4MBもある?!ちょっと過去に戻ってサイズを調べてみる…

バージョン v2.21-2 v2.21-3 v2.21.1-1 v2.21.1-2 v2.21.53 v2.22 v2.23.1
ファイルサイズ 2.9MB 1.8MB 2.9MB 1.8MB 1.9MB 3.8MB 4.0MB

どうも、現状インストールされているv2.22からサイズが急激に成長している。マイナーチェンジでそんなにサイズが変わる訳がないので、ar, as, ldあたりの情報をもう少し詳しく調べてみた。

ファイル ar.exe as.exe ld.exe
ファイルサイズ 1.65MB 2.09MB 1.89MB
コードサイズ 0.57MB 0.74MB 0.67MB
初期化済み
変数サイズ
1.65MB 2.09MB 1.89MB
未初期化
変数サイズ
0.02MB 0.06MB 0.02MB
読込専用
変数サイズ
0.99MB 1.23MB 1.09MB

なんだか妙に読込専用変数(.rdata)が大きい…明らかに変だ。
ファイルから.rdataを抜き出して内容を確認すると、前半は一般的なprintf()などのデータが並んでいるが、後半(?)からはどこぞで見た覚えのあるデータが並んでる。でも、何処で見たのか思い出せない。しかし、こいつがファイルサイズを大きくしている元凶だ。
思い出せないデータは、取りあえず横に置いといて、ソースパッケージを見るが、特に変なパッチはない。変な所にはまりそうなので、すべてを無視して一般的なbinutilsのconfigureを使って、バイナリーを生成してみる。

$ ../binutils-2.22/configure --disable-shared --enable-static
$ make all
$ make install-strip

本当は--disable-sharedだけで良いのだが、たまに駄目子がいて--enable-staticも付けないとconfigureが通らない奴がいるので、念のために付けておく。intel CORE i5クラスなら10分程待てばバイナリーが生成される。なお、今回は後々困らないように、インストール先は/usr/localにしている。と言うわけで出来たバイナリーは以下の通り。

ファイル ar.exe as.exe ld.exe
ファイルサイズ 0.62MB 1.06MB 0.86MB
読込専用
変数サイズ
0.11MB 0.36MB 0.22MB

よくよくREADME等を読んでいくと、MinGWは、mgwportとか言うコマンドで作られているらしい。聞き覚えがないのでMinGW特有のコマンドであろうと思いつつ、叩いてみたら、そんなコマンド無いと言われる orz 探すのは面倒なのでmingw-getに任せる。しかしepoch2-*が無いのには困った。

$ cd MinGW
$ mingw-get install mgwport-bin
$ mingw-get install mingw32-gcc-tools-epoch2-autoconf-bin
$ mingw-get install mingw32-gcc-tools-epoch2-automake-bin

書かれた通りにmgwportを実行すると、おぉ出来る出来る化け物サイズのバイナリーが…
configure, Makefile, makeの実行結果からconfigureを再構成すると次のようになることが判明した(ディレクトリ系は省略)

CC=gcc CFLAGS="-g -O2 -pipe  -mms-bitfields" \
フルパス/binutils-2.22-1-mingw32-src/binutils-2.22-1/src/binutils-2.22/configure \
--target=mingw32 --host=mingw32 --build=mingw32 \
--with-libiconv-prefix=C:/MinGW --with-libintl-prefix=C:/MinGW

これ見て、どこかで見たデータが何処だったのか思い出した。文字変換ルールだ。つまりiconvのバイナリーをar.exe, as.exe, ld.exeに取り込んでいると推測される。たぶん、intlも取り込まれているのだろう。
標準ライブラリならともかく、iconvやintlを取り込んでもしょうが無いので、--with-*-prefixは無し。あと何をとちくるったのか--target, --host, --buildの3つも指定して、しかもmingw32 ?!。正しくはi686-pc-mingw32だろうと思いつつも、ディレクトリが出来てしまっているので、--buildだけで諦める。

CC=gcc CFLAGS="-g -O2 -pipe  -mms-bitfields" \
フルパス/binutils-2.22-1-mingw32-src/binutils-2.22-1/src/binutils-2.22/configure \
--build=mingw32 --disable-shared --enable-static

これだけで、元の1.8MBの世界に戻ります。正常運転するかどうかは明日に持ち越しだ。