12

.dynsymELF 実行可能ファイルの動的シンボル テーブル ( ) の解釈を調べていました。属性を使用してシンボルのアドレスを示し、属性を使用してセクション内の文字列の開始のオフセットを示すことで、シンボル テーブル.symtab(シンボルごとに 16 バイト) を正常に解釈できました。しかし、同じ方法を使用して動的シンボル テーブル ( ) を解釈できません。Aliさんのブログ[1]を参考にしました。valuename.strtab.dynsym

Ali さんの別のブログ [2] を見ましたが、ハッシュ テーブルを使用して動的シンボル テーブルを解釈する方法がわかりません。明らかに、シンボル テーブルで使用されるマッピングと同じではありません。ダイナミック シンボル テーブル (.dynsym) をどのように解釈すればよいですか?

また、私が見ている ELF 実行可能ファイルには、 と の 2 つのセクションが.hashあり.gnu.hashます。ハッシュ値については、どのセクションを参照すればよいですか?

[1] http://blogs.oracle.com/ali/entry/inside_elf_symbol_tables
[2] http://blogs.oracle.com/ali/entry/gnu_hash_elf_sections

4

2 に答える 2

5

ELF 仕様から、各シンボルは次の構造を使用して定義されます。

typedef struct {
      Elf32_Word
      Elf32_Addr
      Elf32_Word
      unsigned char
      unsigned char
      Elf32_Half
} Elf32_Sym;

したがって、一般にこれは 16 バイトになります。ダイナミック シンボル テーブルとスタティック シンボル テーブルは同じ構造を使用するため、このテーブルの解析はスタティックとリンクでまったく同じです。もちろん、値の意味は常に同じではありません。

シンボル テーブル内のシンボルに到達するには、2 つの方法があります。まず、シンボル インデックスが既にわかっている場合は、そのインデックスに移動できます。しかし、シンボル インデックスがなく、シンボル名しかなく、実際には、シンボル テーブルにその名前のシンボルの定義があるかどうかを確認したい場合があります。この 2 番目の状況では、ハッシュ セクションを使用します。これらは、シンボルがシンボル テーブルに存在するかどうかをすばやく確認するために使用されます: symbol-name-> hash-> symb_index-> check if symbol_table[symb_index] == symbol-name.

于 2012-10-01T02:04:44.377 に答える
3

しかし、同じ方法を使用して動的シンボル テーブル (.dynsym) を解釈できません。

セクションで文字列を探す必要があります.dynstr

また、私が見ている ELF 実行可能ファイルには、.hash と .gnu.hash という 2 つのセクションがあります。ハッシュ値については、どのセクションを参照すればよいですか?

検索するシンボルの種類によって異なります。私の知る限り、GNU スタイルのハッシュ テーブルには、動的リンクに関連する情報のみが含まれています。

参照: GNU binutils メーリング リストに投稿されたJakub JelinekによるGNU ハッシュ テーブルの説明

于 2011-08-23T04:48:05.777 に答える