25

私は最近受け取った:

...共有オブジェクトを作成する場合、「ローカルシンボル」に対するR_X86_64_32の再配置は使用できません。-fPICで再コンパイルします

プログラムを共有ライブラリとしてコンパイルしようとしたときにエラーが発生しました。

現在、これに対する解決策はそれほど難しくありません(-fPICを使用してすべての依存関係を再コンパイルします)が、いくつかの調査の結果、この問題はx86-64プラットフォームでのみ発生することがわかりました。32ビットでも、位置に依存するコードは動的ローダーによって再配置できます。

私が見つけた最良の答えは次のとおりです。

x86は、.textの再配置をサポートしています(これは、位置に依存するコードがある場合に発生します)。このサポートにはコストがかかります。つまり、そのような再配置を含むすべてのページは、共有ライブラリにある場合でも基本的に非共有になり、共有ライブラリの概念そのものが台無しになります。したがって、amd64ではこれを禁止することにしました(さらに、すべての.text再配置のサイズは「word32」であるため、値に32ビット以上が必要な場合は問題が発生します)

しかし、これは十分ではありません。再配置が共有ライブラリの概念を台無しにする場合、なぜそれを32ビットプラットフォームで実行できるのでしょうか。また、64ビットをサポートするためにELF形式に変更を加える必要がある場合、対応するためにすべてのフィールドのサイズが大きくならないのはなぜですか?

これはマイナーな点かもしれませんが、a)問題のコードは科学的なコードであり、パフォーマンスに影響を与える必要がないのは良いことであり、b)この情報は最初の場所!

[編集:'答え'

@awoodlandsの回答はおそらく最良の「文字通りの回答」であり、@servnはいくつかの良い情報を追加しました。

さまざまなタイプの再配置について詳しく調べるための検索で、これと最終的にはx86_64 ABIリファレンス(68ページを参照)を見つけました]

4

3 に答える 3

11

私が理解しているように、問題はx86-64が、x86-32には存在しなかった、命令ポインターに関連するデータを参照する新しい、より高速な方法を導入しているように見えることです。

この記事には、それについての詳細な分析があり、次のエグゼクティブサマリーがあります。

データアドレスへの命令ポインタ相対オフセットを使用するx86-64の機能は優れた最適化ですが、共有ライブラリの状況では、データの相対位置に関する仮定は無効であり、使用できません。この場合、グローバルデータ(つまり、自分で変更される可能性のあるもの)へのアクセスは、抽象化レイヤー、つまりグローバルオフセットテーブルを経由する必要があります。

つまり-fPIC、アドレス指定は、アドレス指定に抽象化の追加レイヤーを追加して、通常のアドレス指定スタイルで以前に可能であったもの(および望ましい機能)を新しいアーキテクチャーでも機能させるようにします。

于 2011-08-27T20:14:30.897 に答える
7

しかし、これは十分ではありません。再配置が共有ライブラリの概念を台無しにする場合、なぜそれを32ビットプラットフォームで実行できるのでしょうか。

それは可能ですが、特に効率的ではありません...再配置の計算には実行時間のコストがかかり、再配置された実行可能ファイルは追加のメモリを必要とし、メカニズムは実行可能ローダーに多くの複雑さをもたらします。また、Linuxディストリビューションは、実行可能ファイルのベースアドレスを変更することはセキュリティの脆弱性に対するエクスプロイトの作成をより困難にする緩和戦略であるため、すべてのコードを-fPICでコンパイルすることを本当に奨励したいと考えています。

また、特に-fvisibility = hiddenまたは同等のものを使用する場合、-fPICは一般に大きなパフォーマンスコストではないことにも言及する価値があります。

収容するためにすべてのフィールドのサイズが大きくならないのはなぜですか?

問題の「フィールド」は、x86-64アドレッシングモードの直接のフィールドであり、ELF開発者の管理下にはありません。

于 2011-08-28T02:22:39.437 に答える
0

-mcmodel = largeオプションを使用して、x86_64で-fpicを使用せずに共有ライブラリを構築できます。

参照:http ://eli.thegreenplace.net/2012/01/03/understanding-the-x64-code-models/

于 2013-04-08T19:35:00.260 に答える