gcc には -frecord-gcc-switches
があります そのためのオプション:
-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
が含まれます。
$ 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 つのオプションは -grecord-gcc-swtiches (注意、-f ではなく -g) です。 gcc docs によると、dwarf デバッグ情報にフラグが設定されます。 gcc 4.8 以降、デフォルトで有効になっているようです。
これらの cflags を抽出するには、dwarfdump プログラムが役立つことがわかりました。文字列プログラムはそれらを認識しないことに注意してください。ドワーフの情報が圧縮されているようです。
-frecord-gcc-switches
でコンパイルした場合 flag を指定すると、コマンド ライン コンパイラ オプションがメモ セクションのバイナリに書き込まれます。ドキュメントも参照してください。