2012-06-02 35 views
8

我试图通过访问精灵文件的成员来获得正确的偏移量,但它一直给我零或为零...在一个节头文件中获取sh_name成员elf文件

我应该只使用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 ...我doiing错了什么?

你不是在做什么东西不对。

不是指针,它是到.shstrtab部分的偏移量,其中包含实际的部分名称。

您可以从header->e_shstrndx找到.shstrtab部分。

更新:

不是它想打印的偏移为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中输入时将偏移量打印为整数?我如何打印值 - 以任何方式表示?还,我如何得到实际的名称 - 我知道我得到的偏移量在.shstrtab中的特定部分 - 但我打印名称?我的意思是,我如何引用字符串表?我试图做一些像printf(“%s”,sction + header.shstrtab [nameoffset]);但这并不适合我... – user1431301

+0

@ user1431301看到更新。 –

+0

@EmployedRussian:你能否举一个例子来说明如何做相反的事情,即一个代码示例如何创建字符串表,然后是具有某些值的部分? –