2017-07-26 119 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++; 
    } 
} 

這是我的代碼,以獲取.rela.dyn部分。但我不知道這個符號的名字很熱。我知道Elf64_Rela結構沒有name字段。在'SYMTAB'部分,我可以使用&strtab[p->st_name]獲取符號名稱。我能怎麼做?如何在struct「Elf64_Rela」中獲取符號名稱

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

回答

0

並非所有的重定位都是指符號,所以您首先需要檢查ELF64_R_TYPE (p->r_info)。具有符號的重定位集合是特定於體系結構的。

對於那些具有符號的重定位,ELF64_R_SYM (p->r_info)應該是.dynsym部分中關聯符號的索引。

+0

Thx。 ELFW函數在哪裏聲明? –

+0

哦,這是glibc用於統一32位和64位代碼的快捷方式。我將切換到64位表達式。 –

+0

ELF64_R_SYM(p-> r_info)的返回類型是整數。最終,我想匹配Symtab中的符號和.rela.dyn中的符號。 –

相關問題