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