* nixに実行可能ファイルを作成するために使用されたコンパイラとフラグはありますか?私は自分のコードの古いバージョンをコンパイルしており、最適化の有無にかかわらずコンパイルされているかどうか確認したいと思います。 Googleはあまり役に立ちませんでしたが、正しいキーワードを使用しているかどうかはわかりません。コンパイルされた実行可能ファイルからコンパイラオプションを取得しますか?
答えて
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
もちろん、このオプションを指定せずにコンパイルされた実行ファイルでは機能しません。最適化の簡単なケースでは
、あなたファイルがデバッグ情報付きでコンパイルされた場合は、デバッガを使用して試みることができます。少し踏み込んでいくと、いくつかの変数が最適化されていることがわかります。これは、最適化が行われたことを示唆しています。
+1です。 – Johan
'-frecord-gcc-switches'は私が必要とするものです。しかし、結果のセクションには '-fpreprocessed'があり、' -D'マクロ定義はもう存在しません。どうすれば入手できますか? (私はカーネルモジュールを構築しています。) –
これは、コンパイラのサポートが必要なものです。どのコンパイラを使用しているかは言及していませんが、あなたの質問にタグを付けたので、linux
gccを使用していると仮定します - あなたが尋ねている機能はデフォルトではありません(しかし-frecord-gcc-switchesは実行するオプションですこの)。
バイナリを検査する場合、strings
コマンドは、ファイル内に読み込み可能な文字列として表示されるすべてを表示します。
私は非常にそれが可能である疑う:
int main()
{
}
してコンパイルする場合:
gcc -O3 -ffast-math -g main.c -o main
パラメータのどれもが、生成されたオブジェクトで見つけることができません:あなたの場合は
strings main | grep -O3
(no output)
しかし...私は、同様の "do-nothing"プログラムのために生成された実行可能ファイルと、最適化の有無を比較していましたが、いくつかの違いを示しています... –
'readelf'で確認すると、明示的に "これは' -O3'でコンパイルされたものではありません。 –
-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
セクションが含まれます:
あなたがまだ使用しているコンパイラ(同じバージョン)をまだ持っていて、確信が持てないフラグが1つだけの場合は、フラグを付けてもう一度コンパイルしてみてください。次に、実行可能ファイルを比較することができます。あなたの古いものは、新しいものと同じか、または非常に似ているはずです。
もう1つのオプションは-grecord-gcc-swtichesです(-fではなく-g)。 gccのドキュメントによると、デバッグ情報にフラグを設定します。 gcc 4.8以降はデフォルトで有効になっているようです。
私は、これらのcflagsを抽出するのに便利なdwarfdumpプログラムを見つけました。文字列プログラムはそれらを見ることはできません。矮星の情報が圧縮されているように見えます。
- 1. ユニットパスが実行可能ファイルでコンパイルされました
- 2. 実行可能ファイルからコードを取得する
- 3. .NET(System.Diagnostics.Process)からコンパイルされたjarファイルを実行する
- 4. .NETでビルドされた実行可能ファイルを逆コンパイルできません。
- 5. T-SQLストアドプロシージャからアプリケーションの実行可能ファイル名を取得する
- 6. 実行可能ファイルから静的にリンクされたライブラリを抽出する
- 7. コンパイラは実行可能なコードのみをコンパイルしますか?
- 8. bash自動補完で実行可能ファイルから相対パスを取得
- 9. C++コードから実行可能なjarファイルを実行する
- 10. py2exeから実行可能ファイルのサイズを小さくする
- 11. サーブレットから実行可能なjarファイルを実行しています
- 12. コンパイルされた実行可能メモリ割り当ての変更
- 13. アセンブリ対プロセスから現在の実行可能ファイルの名前を取得していますか?
- 14. Cで実行可能なC実行可能ファイルをCで実行するシェルスクリプトから実行する
- 15. __TEXTと__DATAの取得実行可能ファイル内からのアドレスマッピングのマッピング
- 16. Cで書かれたソースファイルから実行可能ファイルをビルドするには?
- 17. 実行可能ファイルに使用される静的ライブラリのリストを取得
- 18. 実行されたバッチファイルから値を取得する方法
- 19. リモートで実行されたプロセスからステータスを取得する
- 20. 「このファイルを実行しますか?」を取得せずにPowershellからファイルを実行します。ダイアログ
- 21. Eclipseで生成された実行可能なjarファイルは実行されませんか?
- 22. SqlDataSourceから実行されたクエリを取得できますか?
- 23. .javaファイルとpng画像から実行可能ファイルを作成します
- 24. IEフラッシュプレーヤーがC++実行可能ファイルからインストールされているかどうかを検出します。
- 25. 実行可能ファイルを別の実行可能ファイルにインクルード
- 26. QT:ビルドされた実行可能ファイルの名前を変更します。
- 27. Juliaスクリプトからスタンドアロンの実行可能ファイルを作成しますか?
- 28. NetBEANS 7からコンパイルされたアンドロイドアプリケーションを実行するには?
- 29. C++でパラメータを含む実行可能ファイルを実行し、戻り値を取得します。
- 30. linuxのperlソースからネイティブWindows実行ファイルをコンパイルします。
'frecord-gcc-switches'はgccのトリックですが、Intel(icc)にも同様のフラグがありますか? – Mosby
frecord-gcc-switchesなしでこれを行う方法はありますか?例えばループのアンロールなどのレベルを見てください – OneSolitaryNoob