2012-06-02 9 views
8

のelfファイルのメンバーにアクセスしてセクション名に正しいオフセットを取得しようとしていますが、0またはnullを返し続けます...セクションヘッダーelfファイル内のsh_nameメンバーを取得

私だけmmap()elf.hを使用することになっていないんだ - 何のヘルパー関数

だから私がやった:

void* map_start = mmap(0, fd_stat.st_size, PROT_READ | PROT_WRITE , MAP_SHARED, fd, 0)) 
header = (Elf32_Ehdr *) map_start; 
secoff = header->e_shoff;  
section = (Elf32_Shdr *)(map_start + secoff); 

が、私は実行します。

printf("name offset = %d\n", (section->sh_name)); 

それは私に0を与え続ける... 私は間違っているのですか?

答えて

14

私が行うときprintf("name offset = %d\n", (section->sh_name));それは私に0を与え続けます...私は何を間違っていますか?

何かが間違っています。

はポインタではなく、実際のセクション名を含む.shstrtabセクションのオフセットです。

.shstrtabのセクションはheader->e_shstrndxです。

更新:それはintとしてオフセット印刷すると仮定し

イマイチ?

0を印刷します。 0はintではないとあなたは信じられましたか?

でも名前を印刷しますか?

おそらくこの例で説明しますか?

#include <sys/stat.h> 
#include <sys/mman.h> 
#include <elf.h> 
#include <stdio.h> 
#include <fcntl.h> 


int print_shdr(const char *const fname, size_t size) { 
    int fd = open(fname, O_RDONLY); 
    char *p = mmap(0, size, PROT_READ, MAP_PRIVATE, fd, 0); 

    Elf32_Ehdr *ehdr = (Elf32_Ehdr*)p; 
    Elf32_Shdr *shdr = (Elf32_Shdr *)(p + ehdr->e_shoff); 
    int shnum = ehdr->e_shnum; 

    Elf32_Shdr *sh_strtab = &shdr[ehdr->e_shstrndx]; 
    const char *const sh_strtab_p = p + sh_strtab->sh_offset; 

    for (int i = 0; i < shnum; ++i) { 
    printf("%2d: %4d '%s'\n", i, shdr[i].sh_name, 
      sh_strtab_p + shdr[i].sh_name); 
    } 

    return 0; 
} 

int main(int argc, char *argv[]) 
{ 
    struct stat st; 
    const char *fname = "/proc/self/exe"; 

    if (argc > 1) 
    fname = argv[1]; 

    if (stat(fname, &st) != 0) { 
    perror("stat"); 
    return 1; 
    } 
    return print_shdr(fname, st.st_size); 
} 

$ gcc -g dump_shdr.c -m32 -std=c99 
$ ./a.out 
0: 0 '' 
1: 27 '.interp' 
2: 35 '.note.ABI-tag' 
3: 49 '.note.gnu.build-id' 
4: 72 '.hash' 
5: 68 '.gnu.hash' 
6: 78 '.dynsym' 
7: 86 '.dynstr' 
8: 94 '.gnu.version' 
9: 107 '.gnu.version_r' 
10: 122 '.rel.dyn' 
11: 131 '.rel.plt' 
12: 140 '.init' 
13: 135 '.plt' 
14: 146 '.text' 
15: 152 '.fini' 
16: 158 '.rodata' 
17: 166 '.eh_frame' 
18: 176 '.ctors' 
19: 183 '.dtors' 
20: 190 '.jcr' 
21: 195 '.dynamic' 
22: 204 '.got' 
23: 209 '.got.plt' 
24: 218 '.data' 
25: 224 '.bss' 
26: 229 '.comment' 
27: 238 '.debug_aranges' 
28: 253 '.debug_pubnames' 
29: 269 '.debug_info' 
30: 281 '.debug_abbrev' 
31: 295 '.debug_line' 
32: 307 '.debug_frame' 
33: 320 '.debug_str' 
34: 331 '.debug_loc' 
35: 17 '.shstrtab' 
36: 1 '.symtab' 
37: 9 '.strtab' 
+0

私はそれがオフセットであると知っていますが、printfに入れたときにオフセットをintとして出力するとは思いませんか?どのように値を印刷するのですか - どのように表されていますか?また、実際の名前を取得するにはどうすればいいですか?私は.shstrtabの特定のセクションへのオフセットを取得することを知っています。私は、文字列テーブルをどのように参照するのですか?私はprintf( "%s"、sction + header.shstrtab [nameoffset])のようなことをしようとしました。しかし、それは私のために働いていない... – user1431301

+0

@ user1431301更新を参照してください。 –

+0

@EmployedRussian:逆を行う方法の例、つまり文字列テーブルを作成するコード例と、いくつかの値を持つセクションを与える例を教えてください。 –

関連する問題