x86_64で静的ライブラリをコンパイルするときに、GCCが-fpicフラグを暗黙的に提供しないのはなぜですか
-
09-10-2019 - |
質問
静的に静的ライブラリとリンクする共有オブジェクトをコンパイルする多くの問題がありました。この問題は、x84_64プラットフォームにのみ表示されます。 x86_32で同じ編集作業を行うとき、私は何の問題もありません。
おそらくこれはOS固有のGCC構成の問題ですが、私の調査では、GCCがx86_64プラットフォームでどのように機能するかを示しています。とにかく、私はUbuntu 10.04 x86_64でGCC 4.4.3を使用しています。
問題はどのように固定されていますか?...すべての静的ライブラリ依存関係が-fpicでコンパイルされていることを確認してください。
質問1: -fpicと-fpicの違いは何ですか(明らかに-fpicはx86でより多くの指示を生成します)。なぜ後のタイプがx86_64コンテキストでより関連性があるのですか?
質問2: 私の仮定は、静的コードに対してリンクすると、リンク時に機能をバイナリにハードワイリングすると、なぜ「ポジション独立コード」機械が提供する間接のレベルが必要なのですか?
質問3: x86が-fpic / -fpicを必要としない場合、共有オブジェクトを静的アーカイブにリンクするのはなぜx86_64で必要なのですか?
質問4: 必要な場合でも、なぜ暗黙的に供給されないのですか?変化を破ることは大きなノーであると思っていた
解決
- 質問を参照してください 3544035. 。また議論しました ここ と そこの.
- それはあなたがあなたの静的ライブラリに持っている使用に依存します。プログラムにのみリンクしたい場合、PICコードは必要ありません(Libtoolは、それなしではほとんどできないため、コンビニエンスライブラリを呼び出します。たとえば、コンピレーションプロセスを合理的なサイズにするのに役立ちます)。それ以外の場合、共有ライブラリをリンクする場合は、静的ライブラリにPICコードが必要です。
- 質問を参照してください 3146744 そしてまた ここ
- それはあなたのコードを膨らませるので、それはデフォルトではありません。 1つのことは、単一のオブジェクトファイルをコンパイルすると、GCCが共有ライブラリを作成するかどうかがわからないことです。私の小規模なプロジェクトのほとんどでは、いくつかのオブジェクトファイルをリンクするだけで、たとえばPICコードは必要ありません。
また、私のアドバイスは次のとおりです。それについて心配する必要がある場合、あなたはそれを間違っています(または、あなたは難しい方法を学びたいです。コンピレーションシステム(libtool、cmake、使用するものは何でも)はあなたのためにそれをする必要があります。
所属していません StackOverflow