我试图通过访问一个精灵文件的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'