私は '-fPIC
'オプションは、アドレスの解決と個々のモジュール間の独立性と関係がありますが、実際の意味はわかりません。説明できますか?
PICはPosition Independent Codeの略です
引用符で囲むman gcc
:
ターゲットマシンでサポートされている場合は、位置に依存しないコードを出力します。これは、動的リンクに適しており、グローバルオフセットテーブルのサイズ制限を回避します。このオプションは、m68k、PowerPC、およびSPARCで違いをもたらします。位置に依存しないコードには特別なサポートが必要なため、特定のマシンでのみ機能します。
これらのアーキテクチャで共有オブジェクト(* .so)を構築するときにこれを使用します。
f
は、「コード生成で使用されるインターフェイス規則を制御する」オプションのgccプレフィックスです。
PIC
は「Position Independent Code」の略で、m68KおよびSPARC用のfpic
の特殊化です。
編集: x6adb015で参照されるドキュメント のページ11、およびcoryanによるコメントを読んだ後、いくつかの変更を行いました。
このオプションは共有ライブラリでのみ意味があり、グローバルオフセットテーブルGOTを使用していることをOSに伝えています。これは、すべてのアドレス参照がGOTに関連しており、コードを複数のプロセスで共有できることを意味します。
それ以外の場合、このオプションなしでは、ローダーはすべてのオフセット自体を変更する必要があります。
言うまでもなく、ほとんどの場合、-fpic/PICを使用します。
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で違いを生じます。 。 位置に依存しないコードには特別なサポートが必要なため、 は特定のマシンでのみ動作します。