2013年06月26日
GCC でコンパイルした時のオプションをバイナリファイルから取得する
GCC 4.7 のリリースノートに、新しく追加された -grecord-gcc-switches オプションを付けると、DWARF デバッグ情報の DW_AT_producer 属性文字列にコンパイラのコマンドライン文字列が追加されるよ、と書いてあることに気付いたので、さっそく試してみました。
試した環境は Ubuntu 12.04 64bit です。
gcc のバージョンを確認してみたところ、4.6.3 だったので、まずは 4.6 の出力を確認してみます。コンパイルする C ファイルは何でも良いのですが、ここでは test.c というファイルをコンパイルしています。
続いて、PPA チームにより提供されている GCC 4.7 をインストールして試してみました。(参考)
gcc のバージョンを確認してみたところ、4.6.3 だったので、まずは 4.6 の出力を確認してみます。コンパイルする C ファイルは何でも良いのですが、ここでは test.c というファイルをコンパイルしています。
$ cat test.c
int f()
{
return 0;
}
$ gcc -O2 -c -g test.c
$ readelf -wi test.o
Contents of the .debug_info section:
Compilation Unit @ offset 0x0:
Length: 0x4e (32-bit)
Version: 2
Abbrev Offset: 0
Pointer Size: 8
<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
<c> DW_AT_producer : (indirect string, offset: 0x0): GNU C 4.6.3
<10> DW_AT_language : 1 (ANSI C)
<11> DW_AT_name : (indirect string, offset: 0xc): test.c
... (省略)...
DW_AT_producer には、コンパイラとバージョンの情報しか入っていません。続いて、PPA チームにより提供されている GCC 4.7 をインストールして試してみました。(参考)
$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
$ sudo apt-get update
$ sudo apt-get install gcc-4.7
$ gcc-4.7 -v
...(省略)...
gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-2ubuntu1~12.04)
$ gcc-4.7 -O2 -c -g test.c
$ readelf -wi test.o
...(省略)...
<c> DW_AT_producer : (indirect string, offset: 0xa): GNU C 4.7.3
オプションを付けなければ、出力は 4.6 と同じですが、オプションを付けたところ、以下のように期待通りの出力が確認できました。
$ gcc-4.7 -O2 -c -g -grecord-gcc-switches test.c
$ readelf -wi test.o
...(省略)...
<c> DW_AT_producer : (indirect string, offset: 0xa): GNU C 4.7.3 -mtune=generic -march=x86-64 -g -O2 -fstack-protector
4.7 以降の GCC を使う際には、とりあえずこのオプションを付けておけば、どのバイナリをどのオプションでビルドしたかがわからなくなってしまった際などに、役に立つかもしれませんね。