私は '-fPIC
'オプションは個々のモジュール間のアドレスと独立性を解決することと関係があることを知っていますが、実際に何を意味するのかは分かりません。説明できますか?共有ライブラリを構築するときに-fPICとは何を意味しますか?
答えて
PICが位置独立コード
を表し、man gcc
を引用する:
ターゲットマシンではサポートされている場合、位置独立コードを放出する、動的リンクに適したサイズの任意の制限を回避しますグローバルオフセットテーブルこのオプションは、m68k、PowerPC、およびSPARCの違いになります。位置独立コードは特別なサポートを必要とするため、特定のマシンでのみ動作します。
これらのアーキテクチャで共有オブジェクト(* .so)を構築する場合は、これを使用します。
man gcc
は言う:
-fpic Generate position-independent code (PIC) suitable for use in a shared library, if supported for the target machine. Such code accesses all constant addresses through a global offset table (GOT). The dynamic loader resolves the GOT entries when the program starts (the dynamic loader is not part of GCC; it is part of the operating system). If the GOT size for the linked executable exceeds a machine-specific maximum size, you get an error message from the linker indicating that -fpic does not work; in that case, recompile with -fPIC instead. (These maximums are 8k on the SPARC and 32k on the m68k and RS/6000. The 386 has no such limit.) Position-independent code requires special support, and therefore works only on certain machines. For the 386, GCC supports PIC for System V but not for the Sun 386i. Code generated for the IBM RS/6000 is always position-independent. -fPIC If supported for the target machine, emit position-independent code, suitable for dynamic linking and avoiding any limit on the size of the global offset table. This option makes a difference on the m68k and the SPARC. Position-independent code requires special support, and therefore works only on certain machines.
f
「は位置独立コード」の
PIC
スタンド「インターフェースの規則は、コード生成に を使用コントロール」というオプション用のgccのプレフィックスは、それがされていますm68KとSPARC用のfpic
の特化です。
編集:このオプションは、共有ライブラリのみのために理にかなっている
、あなたが使用しているOSを言っている:document referenced by 0x6adb015の11ページ、およびcoryanによってコメントを読んだ後、私はいくつかの変更を加えましたグローバルオフセットテーブル、GOT。これは、すべてのアドレス参照がGOTに関連しており、複数のプロセスにわたってコードを共有できることを意味します。
このオプションを指定しないと、ローダーはすべてのオフセット自体を変更する必要があります。
言うまでもなく、ほとんど常に-fpic/PICを使用しています。
私はOSが任意の仮想アドレスにライブラリをロードすることが自由だと思ったが、pic/PICなしでは、ローダーはコードを修正し、ルーチン/ライブラリの実際の場所へのすべての絶対ジャンプ+ pic/PICでは、コードは変更されていないため、実際には複数のプロセスで共有されます。 – coryan
複数のプロセスは大部分が偶然です。重要なポイントは、絶対アドレスのフィックスアップを最小限に抑えて、任意の仮想アドレスにコードをロードできることです。 –
- 1. スタティックライブラリで共有ライブラリを構築する
- 2. Androidを使ってCMakeと共有ライブラリを構築するNDK
- 3. ライブラリのインストール時に-develとは何を意味しますか?
- 4. GAのフィットネス共有とニッチ数の意味は何ですか?
- 5. nginxで「共有メモリゾーン」とは何を意味していますか?
- 6. cmakeで同時に静的ライブラリと共有ライブラリを構築する方法
- 7. グローバル変数、共有ライブラリ、-fPICエフェクト
- 8. なぜCMake EXPORTは共有ライブラリの構築に使用される静的ライブラリを必要としますか?
- 9. 共有MuPDFライブラリを構築するには?
- 10. 構文指向翻訳とは何を意味しますか?
- 11. スタティックライブラリで共有ライブラリを構築できません
- 12. Makefileとgccを使用して動的共有ライブラリ(.so、.dylib)を構築する
- 13. ラザロを使ってラズベリーに共有ライブラリを構築する
- 14. バージョンサフィックスなしでffmpeg共有ライブラリを構築する方法
- 15. Googleテストを共有ライブラリのように構築する
- 16. 共有オブジェクトライブラリの構築:LDDは、私はDebianの上で共有オブジェクトライブラリを構築しようとしている
- 17. は、ブースト1.48で共有ライブラリを構築できませんでした。
- 18. 2つのFunctorを構成することは何を意味しますか?
- 19. Travis-CIでTensorFlowの共有ライブラリを構築する方法
- 20. 最終コンテンツとしてシェルを構築し共有する
- 21. 共有ファイルセットからタールとジップを構築する
- 22. このPHPライブラリの '\'は何を意味していますか?
- 23. プログラムを「ビルド」することは何を意味しますか
- 24. 「ODRを使用する」とは何を意味しますか?
- 25. Hiveに「ローカルディレクトリを上書きする」とは何を意味しますか?
- 26. "-fPIC"フラグ(共有ライブラリなし)で実行可能なコンパイル
- 27. は共有オブジェクトを作成するときには使用できません。 -fPICで再コンパイルする
- 28. dumpbinを使ってC++ライブラリ情報を見たとき、UNDEFとnotype()は何を意味しますか?
- 29. CMakeでソースを再コンパイルせずに共有ライブラリと静的ライブラリを構築する方法
- 30. サーブレットAPIとポートレットAPIとは何を意味しますか?
FPicの意味は何ですか? –
fは何も意味するものではなく、オプション名の一部です。 – Zifre
fpicとfPICには違いがあります。どちらも同じことをしますが、fpicは利用可能な場合に相対オフセットを短くします。したがって、fpicを使用してコンパイルすると、小さなファイルが生成される可能性があります。残念ながら、それはいつも期待どおりに機能しないので、fPICを使用してください。また、すべてのプロセッサが短いオフセットをサポートしているわけではありませんので、違いはありません。 –