web-dev-qa-db-ja.com

`-fpic`と` -fPIC`のgccパラメーターの違いは何ですか?

すでにgccのマンページを読みましたが、-fpic-fPICの違いを理解できません。誰かが非常にシンプルで明確な方法でそれを説明できますか?


関連する質問:

88

http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

-fPICまたは-fpicを使用して、位置に依存しないコードを生成します。 -fPIC-fpicのどちらを使用して位置独立コードを生成するかは、ターゲットに依存します。 -fPICの選択は常に機能しますが、-fpicよりも大きなコードを生成する可能性があります(覚えておくと覚えやすいのは、PICの方が大きいため、大量のコードが生成される可能性があるためです)。 -fpicオプションを使用すると、通常、より小さく高速なコードが生成されますが、グローバルに表示されるシンボルの数やコードのサイズなど、プラットフォームに依存する制限があります。リンカは、共有ライブラリを作成するときに適合するかどうかを通知します。疑わしい場合は、-fPICを選択します。これは常に機能するためです。

103
Anycorn

Gccマニュアルページ から:

共有ライブラリのコードを生成する場合、-fpicは-msmall-dataを意味し、-fPICは-mlarge-dataを意味します。

どこ:

 -msmall-data
 -mlarge-data
       When -mexplicit-relocs is in effect, static data is accessed via
       gp-relative relocations.  When -msmall-data is used, objects 8
       bytes long or smaller are placed in a small data area (the
       ".sdata" and ".sbss" sections) and are accessed via 16-bit
       relocations off of the $gp register.  This limits the size of the
       small data area to 64KB, but allows the variables to be directly
       accessed via a single instruction.

       The default is -mlarge-data.  With this option the data area is
       limited to just below 2GB.  Programs that require more than 2GB
       of data must use "malloc" or "mmap" to allocate the data in the
       heap instead of in the program's data segment.

       When generating code for shared libraries, -fpic implies
       -msmall-data and -fPIC implies -mlarge-data.
15