2012-02-23 13 views
12

私はMac OS X 10.6でGCC 4.6.2を使用しています。私はコンパイル時に-static-libgccオプションを使用します。そうしないとバイナリがシステム上のlibgccを探しますが、GCC 4.2以上はOS Xでサポートされているとは思えません。これはうまく動作しますが、なぜlibgccが必要なのでしょうか?私はそれを読んで、GNUのドキュメントには「ターゲットプロセッサが直接実行できない算術演算」が含まれていると言われています。これらの操作が何であるかをどのように知っていますか?なぜ私はこのライブラリを組み込む必要があるのですか? GCCはなぜこれらのライブラリ関数に頼る代わりにコードを直接最適化することはできませんか?私は少し混乱しています。これについての洞察は高く評価されます!本当にlibgccが必要ですか?

+0

Unix上で使用可能な同じ:http://unix.stackexchange.com/questions/1812/what-does-libgcc-s-so-contain –

答えて

16

はい、おそらくそれは....必要があります。あなたがそれを必要としないなら、それを静的にリンクすることは無害です。 -tリンクトレースオプションを使用して、必要があるかどうかを判断できます(私はそうだと思います)。

1つの命令では実行できないさまざまなことがあります(通常、32ビットアーキテクチャの64ビット演算など)。これらのことを行うことはできますが、それほど意外な数の命令を使用しない場合は、それらをすべて1か所に配置するのにスペース効率が高くなります。

-O0を使用して最適化を無効にすると(これは実際にはデフォルトですが)、GCCは常にlibgccルーチンを使用します。

あなたはスピード最適化を有効にすると(それがどのように知っている場合)、その後、GCCは直接コードに命令シーケンスを挿入することもできます。 libgccのバージョンを一切使用しないことに気付くかもしれません。libgccの呼び出し回数は少なくなります。

サイズの最適化を有効にすると、GCCが関数呼び出しを優先するか、GCC開発者がそれぞれの場合に最適な速度/サイズのトレードオフと思われるかによって異なります。速度を最適化するように指示しても、コンパイラはの一部の関数が使用される可能性は低いと判断し、それらのサイズを最適化することができます。

基本的には、memcpyや数学ライブラリ関数と同じように考えることができます。コンパイラは、それが有益であると判断したインライン関数を呼び出し、それ以外の場合はライブラリ関数を呼び出します。コンパイラは、ライブラリ定義を見ることなく、標準関数とlibgcc関数を "インライン化"することができます。

静的または動的libgccのどちらを使用するかは、面白いトレードオフです。一方では、動的(共有)ライブラリはシステム全体のメモリ使用量が少なくなり、キャッシュされる可能性が高くなります。一方、静的libgccの呼び出しオーバーヘッドは低くなります。

最も重要なのは互換性ですが。明らかにlibgccライブラリはあなたのプログラムを実行するために存在しなければならないが、互換性のあるバージョンでなければならない。 LinuxディストリビューションではGCC版が安定していて大丈夫ですが、静的リンクは安全です。

ご質問にお答えいただければ幸いです。

+0

はい!スーパーヘルプ。ありがとう! – Synthetix

関連する問題