2017-07-26 2 views
1
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <sys/mman.h> 
#include <errno.h> 
#include <fcntl.h> 
#include <elf.h> 


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 < ehdr->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(p<retab_end) 
    { 
     printf("%x %d\n",p->r_offset,p->r_info); 

     p++; 
    } 
} 

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

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

Répondre

0

Tous les délocalisations font référence à des symboles, de sorte que vous devez vérifier ELF64_R_TYPE (p->r_info) premier. L'ensemble des relocalisations qui ont des symboles sont spécifiques à l'architecture.

Pour les relocalisations comportant des symboles, ELF64_R_SYM (p->r_info) doit être l'index du symbole associé dans la section .dynsym.

+0

Thx. Où est la fonction ELFW déclarée? –

+0

Oh, c'est un raccourci utilisé par la glibc pour unifier le code 32 bits et 64 bits. Je vais passer aux expressions 64 bits uniquement. –

+0

Le type de retour de ELF64_R_SYM (p-> r_info) est entier. Finalement, je veux faire correspondre le symbole dans Symtab et le symbole dans .rela.dyn. –