web-dev-qa-db-ja.com

共有ライブラリを構築するとき、-fPICはどういう意味ですか?

私は '-fPIC 'オプションは、アドレスの解決と個々のモジュール間の独立性と関係がありますが、実際の意味はわかりません。説明できますか?

103
Sasha

PICはPosition Independent Codeの略です

引用符で囲むman gcc

ターゲットマシンでサポートされている場合は、位置に依存しないコードを出力します。これは、動的リンクに適しており、グローバルオフセットテーブルのサイズ制限を回避します。このオプションは、m68k、PowerPC、およびSPARCで違いをもたらします。位置に依存しないコードには特別なサポートが必要なため、特定のマシンでのみ機能します。

これらのアーキテクチャで共有オブジェクト(* .so)を構築するときにこれを使用します。

56
sean riley

fは、「コード生成で使用されるインターフェイス規則を制御する」オプションのgccプレフィックスです。

PICは「Position Independent Code」の略で、m68KおよびSPARC用のfpicの特殊化です。

編集: x6adb015で参照されるドキュメント のページ11、およびcoryanによるコメントを読んだ後、いくつかの変更を行いました。

このオプションは共有ライブラリでのみ意味があり、グローバルオフセットテーブルGOTを使用していることをOSに伝えています。これは、すべてのアドレス参照がGOTに関連しており、コードを複数のプロセスで共有できることを意味します。

それ以外の場合、このオプションなしでは、ローダーはすべてのオフセット自体を変更する必要があります。

言うまでもなく、ほとんどの場合、-fpic/PICを使用します。

27
Mark Beckwith

man gcc言う:

-fpic 
ターゲットマシンでサポートされている場合、共有
ライブラリでの使用に適した位置独立コード(PIC)を生成します。このようなコードは、グローバルオフセットテーブル(GOT)を介してすべての
定数アドレスにアクセスします。 dynamic 
ローダーは、プログラムの起動時にGOTエントリを解決します(dynamic 
ローダーはGCCの一部ではなく、オペレーティングシステムの一部です)。 
リンクされた実行可能ファイルのGOTサイズがマシン固有の
最大サイズを超える場合、リンカーから-fpicが機能しないことを示すエラーメッセージが表示されます。その場合、代わりに-fPICで再コンパイルしてください。
(これらの最大値は、SPARCで8k、m68kおよびRS/6000で32kです。
 386は
 
位置独立コードには特別なサポートが必要であるため、
は特定のマシンでのみ動作します。386では、GCCは
システムのPICをサポートします。 V。ただし、Sun 386i用ではありません。
 IBM RS/6000用に生成されたコードは常に位置に依存しません。
 
-fPIC 
ターゲットマシンでサポートされている場合、位置に依存しないコードを出力します。
ダイナミックリンクに適し、
グローバルオフセットテーブルのサイズ制限を回避します。このオプションは、m68k 
とSPARCで違いを生じます。 。
 
位置に依存しないコードには特別なサポートが必要なため、
は特定のマシンでのみ動作します。
16