6

OpenEmbedded ベースの Aragoを使用して、ソフトウェア パッケージをビルドして rootfs にデプロイしようとしています。残念ながら、ソフトウェア パッケージにはビルド済みの共有ライブラリが含まれています。私が理解している限りでは、Arago は Linux ディストリビューション全体を で構築し--hash-style=gnuていますが、これらの共有ライブラリは で構築されているのではない--hash-style=sysvかと思います。少なくともビルドは「ELF バイナリに GNU_HASH がありません」という QA 問題で停止します。

ハッシュの目的を理解しています。しかし、システムが稼働しているときにそれらがどのように使用されているかはわかりません。

システム内のすべての ELF に対して 1 つのハッシュ スタイルが必要なのはなぜですか? 動的リンカがその場でハッシュ スタイルを決定し、それをそのまま使用できないのはなぜですか?

4

2 に答える 2

4

ダイナミック リンカ、 ELF に存在するハッシュ テーブル (「sysv」または「gnu」) の種類を特定し、それに応じて動作します。

残念ながら、システムで使用されている動的リンカーの古いバージョンに gnu ハッシュ セクションのサポートが移植されていない場合が見られます。

RHEL5/FC6 用にビルドされたバイナリが RHEL4/FC5 で動作しない、同様の状況が存在します。


.gnu.hash が .hash(sysv) と互換性がないのはなぜですか?

gnu ハッシュ セクションを使用して ELF を生成すると、動的シンボル テーブルの構築に特定の制限 (追加の規則) が適用されます。

GNU ハッシュでは、動的シンボル テーブルは 2 つの部分に分割されます。最初の部分は、ハッシュ テーブルから省略できるシンボルを受け取ります。GNU ハッシュは、動的シンボル テーブルのこの部分のシンボルに特定の順序を課しません。

ダイナミック シンボル テーブルの 2 番目の部分は、ハッシュ テーブルからアクセスできるシンボルを受け取ります。これらのシンボルは、上記の GNU ハッシュ関数を使用して (hash % nbuckets) 値を増やしてソートする必要があります。ハッシュ バケット (nbuckets) の数は、以下で説明する GNU ハッシュ セクションに記録されます。その結果、1 つのハッシュ チェーンで検出されるシンボルはメモリ内で隣接し、キャッシュ パフォーマンスが向上します。

参照: blogs.oracle.com/ali/entry/gnu_hash_elf_sections

于 2013-07-02T07:29:20.257 に答える
3

Yocto Arago ビルドでも同じ問題が発生しましたが、Yocto ビルドによって設定され、他の重要なものが含まれているアプリケーションが使用されていないNo GNU_HASH in the ELF binaryことが判明しました。Makefile$(LDFLAGS)-Wl,--hash-style=gnu

この質問は、そのエラー メッセージの検索結果のトップであり、これは他の人に役立つ可能性があるためです。

于 2016-07-19T15:20:05.267 に答える