回答:
PICは位置独立コードの略
そして引用するman gcc
:
ターゲットマシンでサポートされている場合は、動的リンクに適し、グローバルオフセットテーブルのサイズの制限を回避する、位置に依存しないコードを発行します。このオプションは、m68k、PowerPC、およびSPARCで違いをもたらします。位置に依存しないコードは特別なサポートを必要とするため、特定のマシンでのみ機能します。
これらのアーキテクチャーで共有オブジェクト(* .so)を構築するときにこれを使用します。
/usr/bin/ld: /tmp/cc7hXILq.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
fPICを追加してビルドしました。
これf
は、「コード生成で使用されるインターフェース規則を制御する」オプションのgccプレフィックスです。
PIC
「Position Independent Code」の略で、fpic
m68KとSPARCを専門にしたものです。
編集:0x6adb015によって参照されるドキュメントの 11ページ、およびcoryanによるコメントを読んだ後、いくつかの変更を加えました。
このオプションは共有ライブラリにのみ意味があり、OSにグローバルオフセットテーブルGOTを使用していることを伝えています。つまり、すべてのアドレス参照はGOTに関連しており、コードは複数のプロセス間で共有できます。
それ以外の場合、このオプションがないと、ローダーはすべてのオフセット自体を変更する必要があります。
言うまでもなく、ほとんど常に-fpic / PICを使用します。
man gcc
言う:
-fpic 共有での使用に適した位置独立コード(PIC)を生成する ライブラリ(ターゲットマシンでサポートされている場合)。そのようなコードはすべてにアクセスします グローバルオフセットテーブル(GOT)による定数アドレス。ダイナミック ローダーは、プログラムの起動時にGOTエントリを解決します(動的 ローダーはGCCの一部ではありません。オペレーティングシステムの一部です)。もし リンクされた実行可能ファイルのGOTサイズがマシン固有のサイズを超えています 最大サイズ、リンカからエラーメッセージが表示されます -fpicは機能しません。その場合は、代わりに-fPICを使用して再コンパイルしてください。 (これらの最大値は、SPARCでは8k、m68kおよびRS / 6000では32kです。 386にはそのような制限はありません。 位置に依存しないコードには特別なサポートが必要なので、 特定のマシンでのみ機能します。386の場合、GCCはPICをサポートします System Vですが、Sun 386i用ではありません。生成されるコード IBM RS / 6000は常に位置に依存しません。 -fPIC ターゲットマシンでサポートされている場合は、位置に依存しないコードを発行します。 動的リンクに適しており、サイズの制限を回避します グローバルオフセットテーブル。このオプションは、m68kに違いをもたらします そしてSPARC。 位置に依存しないコードには特別なサポートが必要なので、 特定のマシンでのみ機能します。