123

' ' オプションがアドレスの解決と個々のモジュール間の独立性に関係していることは知ってい-fPICますが、それが実際に何を意味するのかはわかりません。説明できますか?

4

3 に答える 3

70

PIC は位置独立コードの略です。

引用するにはman gcc

ターゲット マシンでサポートされている場合は、位置に依存しないコードを発行します。動的リンクに適し、グローバル オフセット テーブルのサイズ制限を回避します。このオプションは、AArch64、m68k、PowerPC、および SPARC で違いを生みます。

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

于 2009-06-08T20:58:32.263 に答える
36

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

PICは「Position Independent Code」の略でfpic、m68K および SPARC に特化したものです。

編集: 0x6adb015 で参照されているドキュメントの 11 ページと、coryan のコメントを読んだ後、いくつかの変更を加えました。

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

そうしないと、このオプションがないと、ローダーはすべてのオフセット自体を変更する必要があります。

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

于 2009-06-08T21:10:12.317 に答える
18

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。

  位置に依存しないコードには特別なサポートが必要です。
  特定のマシンでのみ動作します。
于 2009-06-08T21:02:52.690 に答える