如何在结构"Elf64_Rela"中获取符号名称? [英] How can I get the symbol name in struct "Elf64_Rela"

查看:506
本文介绍了如何在结构"Elf64_Rela"中获取符号名称?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

#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]获取符号名称.我该怎么办?

This is my code to get .rela.dyn section . But I don't know hot to get the symbol's name. I know that Elf64_Rela structure doesn't have a name field. In the 'SYMTAB' section, I can get the symbol name using &strtab[p->st_name]. How can I do?

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

推荐答案

并非所有重定位都引用符号,因此您需要首先检查ELF64_R_TYPE (p->r_info).具有符号的重定位集是特定于体系结构的.

Not all relocations refer to symbols, so you need to check ELF64_R_TYPE (p->r_info) first. The set of relocations which have symbols are architecture-specific.

对于具有符号的重定位,ELF64_R_SYM (p->r_info)应该是.dynsym部分中相关符号的索引.

For those relocations which have symbols, ELF64_R_SYM (p->r_info) should be the index of the associated symbol in the .dynsym section.

这篇关于如何在结构"Elf64_Rela"中获取符号名称?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆