在section header elf文件中获取sh_name成员

我试图通过访问一个精灵文件的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 …我做错了什么?

当我做printf("name offset = %d\n", (section->sh_name)); 它一直给我0 …我做错了什么?

你没有做错什么

sh_name不是一个指针,它是包含实际段名称的.shstrtab段的偏移量。

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

更新:

是不是假设打印偏移量为int?

它打印0 。 是什么让你相信0不是一个整数?

但是我打印这个名字?

也许这个例子会解释?

 #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'