2012-06-02 33 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:你能否舉一個例子來說明如何做相反的事情,即一個代碼示例如何創建字符串表,然後是具有某些值的部分? –