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の世界に戻ります。正常運転するかどうかは明日に持ち越しだ。