1. ホーム

GCCの重要なオプションについて説明します。

2022-03-23 03:48:20

GCC の重要なオプションについて説明します。

詳細はこちらでご確認ください。[GNUコンパイラコレクション(GCC)

https://gcc.gnu.org/onlinedocs/gcc/

https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html

-c  コンパイルするか、コードをコンパイルするが、リンクはしない

-S  コンパイル後に停止し、アセンブルは行わない

-E  前処理後に停止し、コンパイルは行わない

-o  出力ファイル名を指定する

-v  コンパイルの各段階で使用されるコマンドを表示します

-std  使用する言語規格を指定する

-g  デバッグメッセージの生成

-pg  プロファイリングのためにgprofが使用する追加情報を生成します。

-O  実行コードの最適化

-W  コンパイラのアラートレベルを設定する

-ペダンティック ANSI/ISO C 規格に記載されている警告のうち、言語規格に準拠していないものはすべて、対応する警告メッセージを生成します

-I  ファイルが含まれるディレクトリを指定する

-L  ライブラリディレクトリ(コンパイル時のライブラリ検索ディレクトリ)を指定します。

-D  ソースコードに表示されるマクロがあらかじめ定義されています。

-U 定義されたマクロをすべてキャンセルする

-f  コンパイラの動作を制御するためのオプションを指定します。

-m  ハードウェア関連のオプションを指定する

GCC 関連情報表示

-ヘルプ                   このヘルプの説明を表示する

-ターゲットヘルプ            ターゲット・マシンに固有のコマンドライン・オプションを表示する

-help={target|optimizers|warnings|params|[^]{joined|separate|undocumented}}[,...] となります。

特定の種類のコマンドラインオプションを表示する

 ( 子プロセスのコマンドライン引数を表示するには '-v --help' を使用します)

-バージョン                コンパイラのバージョン情報を表示する

-ダンプスペック               すべての組み込み仕様文字列を表示する

-ダンプバージョン             コンパイラのバージョン番号を表示する

-dumpmachine             コンパイラのターゲットプロセッサを表示する

-プリントサーチディール       コンパイラの検索パスを表示する

-print-libgcc-file-name  コンパイラに付属するライブラリの名前を表示する

-print-file-name=< ライブラリ> <ライブラリ> のフルパスを表示します。

-print-prog-name=< program> コンパイラコンポーネントへのフルパス <program&gt を表示します。

-プリントマルチディレクトリ   異なるバージョンの libgcc のルートディレクトリを表示する

-print-multi-lib         コマンドラインオプションと複数リポジトリの検索パスの対応関係を表示する

-print-multi-os-directory オペレーティングシステムライブラリへの相対パスを表示する

-プリントシスルート           ターゲットライブラリディレクトリの表示

-print-sysroot-headers-suffix ヘッダを検索するために使用される sysroot サフィックスを表示する

現在理解されている特定のGCC関連オプション





-fpic

位置非依存コードの生成については、位置非依存コードでは以下のようになります。

1 であり、実行時に動的にメモリにロードされる。

2 異なるプログラムを異なる機会に組み合わせてメモリに読み込む(一般にダイナミックリンクライブラリに使用される)。

3 実行時に異なるアドレスを相互にマッピングすること(例:ブートローダー)

つまり、位置非依存コードとは、プロセスのどのメモリ位置でも実行可能なターゲットコードであり、ダイナミックリンクライブラリで使用する必要があります。

-L.

対応するライブラリファイルのパスを検索します。.は現在のパスです。

-マーチ=armv7-a

-march=armv7-a は、コンパイルされたアセンブリ言語が armv7 アーキテクチャ用であることを意味します。

-mtune =contex-a8

(a) 上記同様、CPUオプションがcontex-a8タイプのボード用です。

-mfloat-abi =ソフト/ソフトエフピー/ハード

"ソフト"。 オプション: FPU ハードウェアを使用する代わりに、GCC の整数演算を使用して浮動小数点演算をエミュレートすることを示します。 このオプションはデフォルトですので、必ずsoftfpに変更してください。

"softfp"。 オプション:関数への引数が整数レジスタ(r0-r3)に渡され、その後 FPU に渡されることを除いて、FPU ハードウェアが浮動小数点演算に使用されることを表します。

"ハード"。 オプション:FPUハードウェアが浮動小数点演算に使用され、関数の引数がFPUのレジスタ(s0, d0)に直接渡されることを示す。

-mfpu =vfpv3-d16

mfloat-abi=softfp/hard, そして -mfpu を指定せずにハード浮動小数点命令で使用されるデフォルトは -mfpu=vfp、つまりネオン SIMD 最適化が行われないことを指定するターゲットマシンで利用可能な浮動小数点ハードウェア(またはハードウェアエミュレーション)。 AArch64 では Advanced SIMD (別名 NEON) が必須なので、コンパイラに NEON を使用するよう指示するコマンドラインオプションは必要ありません。

-mthumb-interwork

このコンパイルオプションは、ARMおよびTHUMB命令セットをサポートするためにアセンブリ言語をコンパイルすることをサポートします。

-mno-thumb-interwork(サム・インターワーク

デフォルトは "です。 -mno-thumb-interwork(サム・インターワーク " を指定するのは "です。

-mthumb-interwork " は、少し大きめのコードを生成しています。

-Wno-write-strings

は、C++ char* から const char* への警告を無視することになり、あまり安全ではありません。

-Wno-trigraphs(ウィノトリグラフ

ANSI Cの3文字単語のコンパイルで発生するエラーを解消します。ANSI C規格では、3文字単語の定義は 9 は、その 3文字の言葉 (trigraph)といい、3文字の単語は、一緒に別の文字を表すいくつかの文字の並びである。

-fno-tree-vectorize

プログラム中のvectorizeオプションをオフにします。gcc -O3は自動的に-ftree-vectorizeオプションをオンにします。

-fno-inline

コード中のinlineキーワードを無視する。このオプションを指定すると、コンパイラーはインライン関数を通常通り扱い、最適化オプションを指定しない場合と同等の扱いをします。

-fshort-enums

enum 型が宣言する値フィールドの範囲のバイト数を割り当てること、すなわち enum 型が十分な大きさの最小の整数型と等しいことをサポートします。

typedef enum num{ <未定義

one = 1,

2=2である。

three = 3です。

four = 4です。

}NUM;

NUM num1です。

sizeof(num1) fshort-enums なしで 4、-fn-short-enums ありで 1。-fn-short-enums はこのオプションがなくても最適化されます。

-Wundef

未定義のシンボルが#if内に現れた場合に警告を表示します。

-安価な最適化機能

コストのかかる最適化手法を実装しても、必ずしも実行時の性能向上が保証されるわけではなく、何らかの悪影響を及ぼす可能性があります。

-レジスタの名前を変更する

レジスタ割り当て後にレジスタの名前を変更することで、意図したコードに偽の依存性が生じるのを防ぎます。

-fomit-frame-pointer

プログラムのパフォーマンスを向上させる機能。原理的な主な違いは、スタックフレームの切り替えとスタックアドレスの保存が少ないこと。gdbがディスアセンブルコマンドを実行した場合、対応するスタックコールアドレスが保存されていないので、関数呼び出しの順序を追跡することができない。

-Wno- パサビ

プロセッサー・サプリメント・アビ(psABI)

-fno-strict-aliasing

コンパイルオプションに -fstrict-aliasing を追加する利点は、異なるタイプの lvalue が無関係なメモリ領域を指すことをコンパイラに示し、コンパイラが多くの最適化を行えるようにすることです。fno-strict-aliasing オプションは、異なるタイプの lvalue が関連するメモリ領域を指す可能性があることをコンパイラに示すので、コンパイラは安全でない極端な最適化を行わない。

-ファンウィンドテーブル (その なぜ巻き戻しマークがたくさんあるのですか? )

テーブルを展開する このテーブルは関数に関する情報を持ち、関数の開始アドレス、関数の終了アドレス、情報ブロックポインタの3つのフィールドからなる。

必要な静的データを生成するだけで、他の方法で生成されたコードに影響を与えないことを除けば、 '-fexceptions' と同様です。

-例外

例外処理を有効にする

注:アンワインドシンボルが多いのは、-funwind-tables と -fexceptions のせいもあります。これは、オブジェクトがリンク後にアンワインドシンボルを生成する __aeabi_unwind_cpp_prN というシンボルを生成させるためです。しかし、これら2つのオプションが定義されていなくても、コード内で明示的に例外がスローされた場合、コンパイラはデフォルトで-fexceptionsを追加し、-fn-exceptionsを手動で強制的に追加した場合はエラーを報告します。 stack unwindは例外をスローした関数から始まり、呼び出しチェーンをキャッチ先の関数まで上がり、例外をスローしたところからスタートすることになるのです。そして、例外がスローされた場所から始めて、コールチェーン内の各スタックフレームに作成されたローカル変数を全体的にクリーンアップします。

-fstack-protector

キー関数のスタックにプロテクト値を設定します。このプロテクト値は、リターンアドレスと戻り値の両方が返される前に検証されます。バッファオーバーフローが発生し、保護値が一致しなくなった場合、プログラムは終了します。プログラムが実行されるたびに、保護値はランダム化され、リモートで推測されることはない。

-finline-limit=64

コンパイラはn個以上の疑似命令を持つ関数をインライン展開しません。デフォルトは600です。この値を大きくすると、コンパイル時間とコンパイルメモリ使用量が増加し、結果のバイナリファイルのサイズが大きくなるので、あまり大きくしない方がよいでしょう。

-符号付き文字

charのデフォルトモードをsigned charに設定する

-正規の接頭辞を持たない

シンボリックリンクを展開したり、'/.S' への参照を解決したりしないでください。/' または '/. /' への参照を解決したり、 相対プレフィックスを生成する際にパスを絶対化したりしないでください。

-fdata-sections と -ffunction-sections

各関数やシンボルをセクションとして作成し、各セクション名は関数名やデータ名と一致させる。コンパイラが各関数やデータに別々のセクションを割り当てても

- Wl,-gc-セクション ( なぜ、記号が欠落してしまうのですか? )

はリンカに未使用のセクションを削除するよう指示し (-wl, は後の引数 -gc-sections がリンカに渡されることを示す)、リンク操作はセクションを最小の処理単位として (-ffunction-sections と組み合わせて) 使用し、あるセクションでシンボルが参照されると、そのセクションは出力に置かれる。

とは何ですか? "です。 引用 " というのは、個人的には "です。

呼び出される " exportによるリンカーはこれをインターフェイスと見なします。

-ーワ ,--noexecstack

ld リンカースタックセグメント非実行機構を実行する(-wl は、後の引数 -gc-sections がアセンブラに渡されることを示す)。

-frtti

RTTI (Run-Time Type Identification)と呼ばれるもので、実行時の型情報を持つプログラムは、基底クラスへのポインタや参照を利用して、そのポインタや参照が参照するオブジェクトの実際の派生型をチェックすることができる。 -frtti オプションは、rtti 機能をサポートするために、仮想関数を持つ各クラスにいくつかの情報を追加します。 ダイナミックキャスト タイプID などがありますが、このオプションはデフォルトでオンになっており、通常はスペースを節約するために -fno-rtti でオフにします。

-fvisibility=hidden

シンボルテーブルを非表示にする機能が実装されています。nm表示すると、シンボルタイプがTからtに変わるのがわかります。ローカルシンボルtを削除する方法としては、strip -xを呼んで削除することができます。動的共有ライブラリからできるだけ少ないシンボルを出力するのは良い習慣です。制限されたシンボルを出力することで、プログラムのモジュール性が向上し、実装の詳細が隠されます。また、ライブラリ内のシンボル数を減らすと、ライブラリのメモリフットプリントが減少し、ダイナミックリンカーの作業負荷が軽減されます。ダイナミックリンカーが読み込み、認識するシンボルの数が少なければ少ないほど、プログラムの起動と実行が速くなります。

インターフェース関数の場合、関数宣言の前に __attribute__ ((可視性 ("デフォルト"))) で、そのシンボルは別にエクスポートされます。