2012-06-02 13 views
8

Próbuję uzyskać poprawne przesunięcie nazwy sekcji, uzyskując dostęp do elementu 018 pliku elfa, ale nadal daje mi zero lub zero ...Pobieranie elementu sh_name w pliku nagłówka sekcji

mam używać tylko mmap() i elf.h - funkcje pomocnicze nie

Więc zrobiłem:

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); 

ale kiedy zrobić:

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

to daje mi 0 ... co robię źle?

Odpowiedz

14

kiedy robię printf("name offset = %d\n", (section->sh_name)); to daje mi 0 ... co robię źle?

Nie robią nic złego.

nie jest wskaźnikiem, jest przesunięciem w sekcji .shstrtab, która zawiera rzeczywistą nazwę sekcji.

Sekcję .shstrtab można znaleźć pod adresem header->e_shstrndx.

Aktualizacja:

isnt to przypuszczać, aby wydrukować offset jako int?

Drukuje 0. Co sprawiło, że uwierzyłeś, że 0 nie jest int?

ale czy mogę wydrukować nazwę?

Być może ten przykład wyjaśni?

#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

Wiem, że ma to być przesunięcie, ale czy nie należy drukować przesunięcia jako int, gdy umieszczam w printf? jak wydrukować wartość - w jakikolwiek sposób reprezentowany? również, w jaki sposób uzyskać rzeczywistą nazwę - wiem, że uzyskać przesunięcie do konkretnej sekcji w .shstrtab - ale czy mogę wydrukować nazwę? Mam na myśli, w jaki sposób odnoszą się do tabeli ciągów? próbowałem zrobić coś takiego jak printf ("% s", sction + header.shstrtab [nameoffset]); ale to nie działało dla mnie ... – user1431301

+0

@ user1431301 Zobacz aktualizację. –

+0

@EmployedRussian: Czy możesz podać przykład odwrotnej strony, np. Przykład kodu, jak utworzyć tabelę ciągów, a następnie sekcję z pewnymi wartościami? –

Powiązane problemy