66

静的ライブラリに対して静的にリンクする共有オブジェクトをコンパイルする際に、多くの問題が発生しました。この問題は、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:必要な場合でも、暗黙的に提供されないのはなぜですか? 重大な変更は絶対にダメだと思っていた

4

2 に答える 2

57
  1. 質問3544035を参照してください。また、あちこちで議論されてます。
  2. 静的ライブラリをどのように使用するかによって異なります。それをプログラムにリンクしたいだけなら、PIC コードは必要ありません (libtool はこれを便利なライブラリと呼んでいます。これがなくてもほとんどのことができるためです。たとえば、コンパイル プロセスを適切なサイズにするのに役立ちます)。それ以外の場合、共有ライブラリをリンクする場合は、スタティック ライブラリに PIC コードが必要です。
  3. 質問3146744およびこちらも参照してください
  4. コードが肥大化するため、デフォルトではありません。注目すべきことの 1 つは、単一のオブジェクト ファイルをコンパイルするとき、GCC はそのファイルから共有ライブラリを作成するかどうかを認識していないということです。私の小規模なプロジェクトのほとんどでは、いくつかのオブジェクト ファイルをリンクするだけで、たとえば PIC コードは必要ありません。

また、私のアドバイスは次のとおりです。それについて心配する必要がある場合は、それが間違っています (または、経験からより多くを得ることができるので、難しい方法で学びたいと思っています)。コンパイルシステム(libtool、cmake、使用するものは何でも)がそれを行う必要があります。

于 2010-10-27T18:35:35.837 に答える