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

これは私のコードセクションです。しかし、私はシンボルの名前を得るために熱い知らない。私はElf64_Rela構造にはnameフィールドがないことを知っています。 'SYMTAB'セクションでは、&strtab[p->st_name]を使ってシンボル名を得ることができます。どのようにできるのか?構造体 "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のシンボルを一致させたいと思います。 –

関連する問題