2009-07-22 12 views
10

私が取り組んでいるプロジェクトのメークファイルをまとめています。プロジェクトには実行可能ファイルと共有ライブラリがあります。両方ともオブジェクトファイルに別々にコンパイルされた同じソースファイルのいくつかを使用します。これらのオブジェクトを共有ライブラリで使用できるようにするには、gccで-fPIC(position independent code)フラグを使用する必要があります。実行可能ファイルで使用される-fPICを使用してオブジェクトをコンパイルすることの意味はありますか?実行ファイルでgcc -fPICフラグが指定されているオブジェクトをコンパイルするとどうなりますか?

+0

GCC7では、-fPICでコンパイルされたものがすべて必要になります。少なくとも私はnエラーを取得し、なぜ私はエラーを取得するの検索でこの質問を発見した? – Lothar

+0

@Lotharいいえ、それは一般的にそれを必要としません。 '-fPIC'の有無にかかわらずコンパイルされたオブジェクトですか? – ephemient

答えて

9

位置非依存のコードをコンパイルする必要がない場合は、一部のプラットフォームではパフォーマンスが低下します(PICは非PICの場合にはより自由に使用できるレジスタを削除するためです)そうでなければ有害な影響を与えてはならない。

さらに、位置に依存しないコードだけで構築された位置に依存しない実行可能ファイル(-fPIE)を作成することも可能です。

つまり、libtoolは、コンパイルする各ソースファイルに対してPICとPIC以外のオブジェクトを自動的に生成することができます。また、libtoolを統合しないビルドシステムでも同じことを行うのは簡単です。

+0

PICはx86上のレジスタを削除しません。このCPUは位置間接コードを持たないため、常にデータ/関数に間接参照を追加します。あなたがそれを指定しなければ高速なコードを取得し、リンカが各実行ファイルのコードセグメントを複製するので、x86上では-fPICを完全に忘れることができます。 – Lothar

+0

@Lotharコンパイラによっては、PICはレジスタを削除します。 5.0以前のGCCは '%ebx'を予約しているため、一般的な使用には使用できません。 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54232 – ephemient

関連する問題