01. コンパイルオプションとカーネルコンパイル Linux カーネル (英語: linux kernel) は、POSIX 標準に準拠し、C 言語とアセンブリ言語で記述され、GNU General Public License に基づいてリリースされているコンピュータ オペレーティング システム カーネルです。技術的に言えば、Linux は単なるカーネルです。 「カーネル」とは、ハードウェア抽象化レイヤー、ディスクおよびファイルの制御、マルチタスクなどの機能を提供するシステム ソフトウェアを指します。 まず、Linux カーネルが O0 でコンパイルされている場合はコンパイルできないことは誰もが知っています。Linux カーネルは O2 または Os でコンパイルされます。これは Linux Makefile から確認できます。 選択すると
Os になります。それ以外の場合は O2 になります。 実際、O2 と Os はいくつかの最適化オプションの集合です。 gcc -c -Q -O2 --help=オプティマイザ > /tmp/O2-opts gcc -c -Q -Os --help=オプティマイザ > /tmp/Os-opts 前者は速度の最適化に基づく傾向があり、後者はより小さなサイズの最適化に基づく傾向があります。 2 つのスイッチ オプションを比較します。 /tmp/O2-opts /tmp/Os-optsをマージする その差は悲しいほど小さいです: O2 と Os はどちらもインラインの小さな関数と一度だけ呼び出される関数を有効にしますが、-finline-functions は O2 では無効になっており、Os では有効になっています。 O2 では optimize-strlen はオンですが、Os ではこのオプションはオフになっています。関連するオプションの意味は、「man gcc」で確認できます (質問がある場合は、man を検索してください)。たとえば、man gcc の後に inline-functions を検索すると次のようになります。 O0 から O1、O2、O3 へと、有効にする最適化オプションの数を徐々に増やしていくプロセスです。 カーネル自体は O0 でコンパイルするように設計されていないため、カーネルを O0 でコンパイルすることはできません。カーネルの設計には、コンパイルが最適化されるという前提が含まれています。これを説明するために簡単な例を使ってみましょう。 02. 簡単な例 次のコード: O0 コンパイルでは、f() 関数が定義されていないという次のエラーが報告されます。 $ gcc -O0 cc.c cc.c:1:13: 警告: 'f' が使用されていますが、定義されていません [デフォルトで有効] void f(void); ^ /tmp/ccTwwtHG.o: 関数 `main' 内: cc.c:(.text+0x19): `f' への未定義の参照 collect2: エラー: ld が 1 終了ステータスを返しました しかし、O2 でコンパイルすると、問題は発生しません。 $ gcc -O2 cc.c その理由は、O2 がコンパイルされると、a == 1 であることが認識されるため、if (a>2) は成立せず、f() が定義されていなくても問題にならないからです。 コードを少し変更した後: O2は現在動作していません: $ gcc -O2 cc.c /tmp/ccXiyBHn.o: 関数 `main' 内: cc.c:(.text.startup+0x7): `f' への未定義の参照 collect2: エラー: ld が 1 終了ステータスを返しました したがって、この例から、同じコードが O2 では合格できるのに O0 では合格できない理由がわかります。カーネルには、コンパイラによって最適化されるはずのコードが多数あります。 3. もうインライン化したくない コンパイルの最適化により、一部の関数(小さな関数やプロジェクト全体で 1 人だけが呼び出す関数など)は明示的にインラインとして記述されていないにもかかわらず、コンパイラによってインラインに最適化されます。この関数に対応するシンボルが見つからないため、デバッグ時に問題が発生します。 この時点で、特定の関数をインライン化したくないことを明示的に指定できます。 そうでない場合、O2 と Os は関連するインライン オプションを有効にするため、コードに inline を記述していなくても、上記 2 つの関数はコンパイラによって自動的にインライン化される可能性があります。インライン化を拒否する場合は、noline でマークできます。 4. 最適化されたくない O1、O2、O3、および Os がグローバルに有効になっている場合、単一の関数に対して最適化を実行したくない場合は、 O2で再コンパイル: $ gcc -O2 cc.c /tmp/cc8M338p.o: 関数 `main' 内: cc.c:(.text+0x19): `f' への未定義の参照 collect2: エラー: ld が 1 終了ステータスを返しました 5. 結論 以下に実用的なガイドラインをいくつか示します。
要約する 上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。 以下もご興味があるかもしれません:
|
>>: MySQL 5.7.17 winx64 無料インストールバージョン設定方法グラフィックチュートリアル
目次序文React 関数コンポーネントVue (2.x) の機能コンポーネント🌰 例: el-tab...
目次1. 現実的な背景2. 合意3. マスターを構成する3.1. 起動パラメータの設定3.2. パラ...
シナリオ: 仮想マシンの Docker コンテナに最新バージョンの MySQL をインストールした後...
目次概要1. スタックとヒープ2. 変数オブジェクトと基本データ型3. 参照データ型とヒープメモリメ...
目次1. スタイル属性をバインドして変更するhtml:対応するjs:達成された効果:次に、refを使...
偶然、プロジェクト内でVue.$setが無効であることがわかりましたデータ フィルタリングを追加する...
nginxのインストール仮想マシンがインターネットにアクセスできることを確認します。 1. ルートユ...
オリンピック期間中にIE8ベータ2がリリースされ、英語版のリリースに合わせて中国語版も第一波でリリー...
1 公式サイトからMySQL8をダウンロードしてインストールするMySQL8 ダウンロードアドレスこ...
1. vue2 での従来の書き方 // 親コンポーネントは 'foo' を提供します...
なぜ高さを設定できるのでしょうか。<h1 /> などの要素とは異なり、「セミインライン」...
この記事では、最も単純なビデオ連射機能をシミュレートするデモを作成します。アイデア:再生する動画と同...
序文国家とは何か私たちは皆、React はステート マシンであると言います。それはどのように反映され...
無料のパブリック STUN サーバーSIP 端末がプライベート IP アドレスを使用する場合、スタン...
1. VMware vSphere の概要VMware vSphere は、業界をリードする最も信...