0

わかりました...だから、mmapのみを使用してelfファイルのすべてのセクション名を出力するプログラムを書くとします(それは重要ではありません...)

これまでに行ったことはこれです-ファイルを統計構造にマップしました = map_start = mmap(0, fd_stat.st_size, PROT_READ | PROT_WRITE , MAP_SHARED, fd, 0)) <0 )

私が得た開始点から書き込み形式にキャストしました = header = (Elf32_Ehdr *) map_start;

ファイルからセクション ヘッダー オフセットを取得 = secoff = header->e_shoff;

今-私はmap_start + secoffの場所に行く必要があることを知っています-それは私にセクションテーブルを与え、sh_nameは私に文字列テーブルのインデックスを与えます...

スティングテーブルに行くにはどうすればいいですか?それはどのように表されますか?どうやって使うの?sh_name の値、文字列テーブルのインデックス (配列として表されている場合)、またはオフセットです。

とにかく - 最初の 2 つのセクションの名前を出力したいとしましょう - 上記で書いたコードをどのようにすればよいでしょうか?

4

1 に答える 1

0
header = (Elf32_Ehdr *) map_start;
secoff = header->e_shoff;

これはおそらく間違っています。Elf32_Ehdr 構造体が明示的に宣言されていない限り、__attribute__((packed))コンパイラは最終的に構造体のメンバー間にパディングを挿入しますsizeof(Elf32_Ehdr) != (the actual size of an ELF header section)。代わりに libelf アクセサ関数を単純に使用しないのはなぜですか?

更新:アクセサー関数の使用が許可されていない場合は、次のようにする必要があります。

Elf32_Ehdr hdr;
memcpy(&hdr.e_ident, map_start + 0, EI_NIDENT);
memcpy(&hdr.e.type, map_start + 0 + sizeof(Elf32_half), sizeof(Elf32_Half));

など。

于 2012-06-01T18:10:47.093 に答える