Comment puis-je obtenir le nom du symbole dans la structure “Elf64_Rela”

#include  #include  #include  #include  #include  #include  #include  #include  #include  #include  Elf64_Rela *retab; Elf64_Rela *retab_end; Elf64_Ehdr *ehdr; Elf64_Shdr *shdr; char *strtab; void elf_open(char *filename) { int fd = open(filename, O_RDONLY); struct stat sbuf; fstat(fd, &sbuf); void *maddr = mmap(NULL, sbuf.st_size, PROT_READ, MAP_SHARED, fd, 0); close(fd); ehdr = maddr; shdr = (Elf64_Shdr *)(maddr + ehdr->e_shoff); for (int i = 0; i e_shnum; i++) { if (shdr[i].sh_type == SHT_RELA) { retab = (Elf64_Rela *)(maddr + shdr[i].sh_offset); retab_end = (Elf64_Rela *)((char *)retab + shdr[i].sh_size); strtab = (char *)(maddr + shdr[shdr[i].sh_link].sh_offset); break; } } } int main() { elf_open("lib1.so"); Elf64_Rela *p = retab; while(pr_offset,p->r_info); p++; } } 

Ceci est mon code pour obtenir la section .rela.dyn . Mais je ne sais pas trop comment obtenir le nom du symbole. Je sais que la structure Elf64_Rela n’a pas de champ de name . Dans la section ‘SYMTAB’, je peux obtenir le nom du symbole en utilisant &strtab[p->st_name] . Comment puis-je faire?

 typedef struct { Elf64_Addr r_offset; Elf64_Xword r_info; Elf64_Sxword r_addend; } Elf64_Rela; 

Toutes les relocalisations ne font pas référence à des symboles, vous devez donc vérifier ELF64_R_TYPE (p->r_info) premier. L’ensemble des relocalisations comportant des symboles est spécifique à l’architecture.

ELF64_R_SYM (p->r_info) doit être l’index du symbole associé dans la section .dynsym les .dynsym des .dynsym .