Comment imprimer le nom des symboles de fichiers ELF tel que le nm?

Je sais que le nom des symboles est dans le shstrtab. Mais je ne comprends pas comment les attraper. Dois-je convertir mon shstrab dans un Elf64_Sym afin de pouvoir utiliser le st_name?

Elf64_Shdr *shdr = (Elf64_Shdr *) (data + elf->e_shoff); Elf64_Shdr *symtab; Elf64_Shdr *shstrtab; Elf64_Shdr *strtab; char *str = (char *) (data + shdr[elf->e_shstrndx].sh_offset); for (int i = 0; i e_shnum; i++) { if (shdr[i].sh_size) { printf("%s\n", &str[shdr[i].sh_name]); if (strcmp(&str[shdr[i].sh_name], ".symtab") == 0) symtab = (Elf64_Shdr *) &shdr[i]; if (strcmp(&str[shdr[i].sh_name], ".shstrtab") == 0) shstrtab = (Elf64_Shdr *) &shdr[i]; if (strcmp(&str[shdr[i].sh_name], ".strtab") == 0) strtab = (Elf64_Shdr *) &shdr[i]; } } str = (char *) shstrtab; for (size_t i = 0; i sh_size / sizeof(Elf64_Sym *)); i ++) { printf("%s\n", &str[shstrtab[i].sh_name]); } 

    Dois-je convertir mon shstrab dans un Elf64_Sym afin de pouvoir utiliser le st_name?

    Non.

    Voici la boucle que vous voulez:

     Elf64_Sym *sym = (Elf64_Sym*) (data + symtab->sh_offset); str = (char*) (data + strtab->sh_offset); for (size_t i = 0; i < (symtab->sh_size / sizeof(Elf64_Sym *)); i++) { printf("%s\n", str + sym[i].st_name); }