2012-08-24 10 views
36

* nixに実行可能ファイルを作成するために使用されたコンパイラとフラグはありますか?私は自分のコードの古いバージョンをコンパイルしており、最適化の有無にかかわらずコンパイルされているかどうか確認したいと思います。 Googleはあまり役に立ちませんでしたが、正しいキーワードを使用しているかどうかはわかりません。コンパイルされた実行可能ファイルからコンパイラオプションを取得しますか?

+1

'frecord-gcc-switches'はgccのトリックですが、Intel(icc)にも同様のフラグがありますか? – Mosby

+0

frecord-gcc-switchesなしでこれを行う方法はありますか?例えばループのアンロールなどのレベルを見てください – OneSolitaryNoob

答えて

48

gccのはそのため-frecord-gcc-switchesオプションがあります。

$ gcc -O2 -frecord-gcc-switches a.c 
$ readelf -p .GCC.command.line a.out 

String dump of section '.GCC.command.line': 
    [  0] a.c 
    [  4] -mtune=generic 
    [ 13] -march=x86-64 
    [ 21] -O2 
    [ 25] -frecord-gcc-switches 

もちろん、このオプションを指定せずにコンパイルされた実行ファイルでは機能しません。最適化の簡単なケースでは


、あなたファイルがデバッグ情報付きでコンパイルされた場合は、デバッガを使用して試みることができます。少し踏み込んでいくと、いくつかの変数が最適化されていることがわかります。これは、最適化が行われたことを示唆しています。

+0

+1です。 – Johan

+0

'-frecord-gcc-switches'は私が必要とするものです。しかし、結果のセクションには '-fpreprocessed'があり、' -D'マクロ定義はもう存在しません。どうすれば入手できますか? (私はカーネルモジュールを構築しています。) –

3

これは、コンパイラのサポートが必要なものです。どのコンパイラを使用しているかは言及していませんが、あなたの質問にタグを付けたので、linux gccを使用していると仮定します - あなたが尋ねている機能はデフォルトではありません(しかし-frecord-gcc-switchesは実行するオプションですこの)。

バイナリを検査する場合、stringsコマンドは、ファイル内に読み込み可能な文字列として表示されるすべてを表示します。

1

私は非常にそれが可能である疑う:

int main() 
{ 
} 

してコンパイルする場合:

gcc -O3 -ffast-math -g main.c -o main 

パラメータのどれもが、生成されたオブジェクトで見つけることができません:あなたの場合は

strings main | grep -O3 
(no output) 
+0

しかし...私は、同様の "do-nothing"プログラムのために生成された実行可能ファイルと、最適化の有無を比較していましたが、いくつかの違いを示しています... –

+0

'readelf'で確認すると、明示的に "これは' -O3'でコンパイルされたものではありません。 –

11

-frecord-gcc-switchesフラグを指定してコンパイルすると、コマンドライン・コンパイラー・オプションは、電子メモセクション。 See also the docs

-frecord-gcc-switches 
     This switch causes the command line that was used to invoke the compiler to 
     be recorded into the object file that is being created. This switch is only 
     implemented on some targets and the exact format of the recording is target 
     and binary file format dependent, but it usually takes the form of a section 
     containing ASCII text. 

その後、ELF実行可能ファイルは、その情報に基づいて.GCC.command.lineセクションが含まれます:

+0

バイナリをチェックする最良の方法は何ですか?ヘキサエディター? binutils? – Johan

+2

@Johan: 'readelf' –

+0

文字列は私のために働かなかった、readelfは働いた。 – Johan

1

あなたがまだ使用しているコンパイラ(同じバージョン)をまだ持っていて、確信が持てないフラグが1つだけの場合は、フラグを付けてもう一度コンパイルしてみてください。次に、実行可能ファイルを比較することができます。あなたの古いものは、新しいものと同じか、または非常に似ているはずです。

5

もう1つのオプションは-grecord-gcc-swtichesです(-fではなく-g)。 gccのドキュメントによると、デバッグ情報にフラグを設定します。 gcc 4.8以降はデフォルトで有効になっているようです。

私は、これらのcflagsを抽出するのに便利なdwarfdumpプログラムを見つけました。文字列プログラムはそれらを見ることはできません。矮星の情報が圧縮されているように見えます。

関連する問題