2012-01-02 9 views
2

私はこれを見つめて、グーグルで調べていますが、私は何をしたのか分かりません。ブーストテストのfpicリンクエラー

私は32ビットマシンで作業中のプロジェクトを持っています。私は(プロジェクトのために、元の開発マシンだった)64ビットマシンにリポジトリを引っ張っていると私は今

/usr/bin/ld: error: /usr/lib/libboost_test_exec_monitor-mt.a(unit_test_log.o): requires dynamic R_X86_64_PC32 reloc against 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&)' which may overflow at runtime; recompile with -fPIC 
/usr/bin/ld: error: /usr/lib/libboost_test_exec_monitor-mt.a(unit_test_log.o): requires unsupported dynamic reloc 11; recompile with -fPIC 

テストバイナリをビルドしようとしたとき、私は本当にすることはできません、次のリンクエラーを取得しています私は何が変わったのかを見てください。ブーストライブラリは、ubuntuリポジトリから直接引き出されます。誰かが手がかりを持っている。

答えて

0

さて、サイモンの答えは本当に助けになりました。この特定の問題に

究極の解決策は、エラーがある(ない)

libboost_test_exec_monitor 

2

共有ライブラリは2通りの方法で設定できます。 1つは絶対アドレスであるため、共有オブジェクトをロードする各バイナリには共有コードのコピーが割り当てられますが、呼び出しには間接的な指示はなく、可能な限り高速です。もう1つの方法は、 "PIC"または位置独立コードです。これにより、インダイレクションの余分なレイヤーが追加されますが、共有ライブラリー・コードの1つのコピーは、インダイレクションの余分なレイヤーがアプリケーションバイナリーであるため、必要なすべてのアプリケーションに対応できます。

64ビットでビルドしようとすると、最初のオプションの絶対アドレスは特定の64ビットアドレスを強制できません(コード内のオブジェクトファイルの中には、 tは64ビットアドレスをサポートしています)、コンパイラはがあり、PICを有効にしてオプション2を使用しています。これを行うには、すべてのコードとライブラリをg ++/gccと仮定して-fPICでコンパイルする必要があります。ライブラリを-sharedとリンクする必要があるかもしれませんが、正確な時間を思い出すことはできません。

+0

の代わりに(共有ライブラリが付属しています)

libboost_unit_test_framework 

を使用していましたlibboost_test_exec_monitor-mt.aに私を指し示しています - おそらくboostライブラリはfpicでコンパイルされているでしょうか?どのライブラリを私がfpicでコンパイルするのを忘れたかを判断する方法はありますか – Tom

14

静的ライブラリ(Boostの1つ)をダイナミックライブラリにリンクしています。静的ライブラリは、通常は-fPICで構築されません。これは、プログラムにのみリンクされ、別のライブラリにはリンクされていないとみなされます。

32ビットx86では、このようなコードは、位置に依存しないコードの部分をロードアドレスに再配置することで、静かに修正されます。影響を受けたページは共有できなくなります。これを行うには、再配置エントリをリンク時から実行時の再配置に変換する必要があります。

この変換はx86 64ビットで失敗します。 2つのエラーメッセージは、

  1. 共有ライブラリは、64ビットプラットフォーム上で広いそれらを離れて配置するれ、セキュリティ上の理由からランダムアドレスに住んで(リロケーションは32ビット値に適用されるが、変位はより大きくてもよいことを意味します
  2. このため、スタティックライブラリから再配置エントリに対応する動的再配置タイプが存在しない。

従って、リンカーは、ロード可能であろうコードを生成し、そして当然そうすることを拒否することができません。

この問題を解決するには、共有libboost_test_exec_monitor-mtにリンクするか、静的ライブラリを自分で構築する必要があります。