c - 在 ELF 可执行文件中检索 RELA 的符号名称

标签 c matplotlib symbols elf relocation

我正在尝试检索在 ELF 可执行文件中找到的 RELA 跳转槽的符号名称。使用 libElf,我设法检索了 RELA 的地址,但仍在尝试弄清楚如何获取符号(-name)。

根据 How can I get the symbol name in struct "Elf64_Rela" ,该符号存储在我尝试查询但没有令人满意的结果的 DYNSYM 部分中。

这是我到目前为止得到的(虽然有点脏):

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <libelf.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <gelf.h>

#define LIB_PATH "/tmp/a.out"

int main(void)
{
    int fd = open(LIB_PATH, O_RDONLY);
    Elf *elf;
    Elf_Scn *scn;
    Elf_Data *rela_data = NULL;
    Elf_Data *sym_data = NULL;
    GElf_Shdr shdr_rela;
    GElf_Shdr shdr_sym;
    GElf_Rela rela;
    GElf_Sym sym;
    int count = 0;

    elf_version(EV_CURRENT);
    elf = elf_begin(fd, ELF_C_READ, NULL);
    if (!elf)
            fprintf(stderr, "ERROR: %s\n", elf_errmsg(elf_errno()));
    for (scn = elf_getscn(elf, 0); scn; scn = elf_nextscn(elf, scn))
    {
        gelf_getshdr(scn, &shdr_sym);
        if (shdr_sym.sh_type == SHT_DYNSYM)
            break;
    }
    sym_data = elf_getdata(scn, sym_data);
    for (scn = elf_getscn(elf, 0); scn; scn = elf_nextscn(elf, scn))
    {
        gelf_getshdr(scn, &shdr_rela);
        if (shdr_rela.sh_type == SHT_RELA)
            break;
    }
    scn = elf_nextscn(elf, scn);
    gelf_getshdr(scn, &shdr_rela);
    rela_data = elf_getdata(scn, rela_data);
    for (unsigned int it = 0; it < (shdr_rela.sh_size / shdr_rela.sh_entsize); ++it)
    {
        gelf_getrela(rela_data, it, &rela);
        gelf_getsym(sym_data, GELF_R_SYM(rela.r_info), &sym);
        printf("[%-8p]: (%d) %s\n", rela.r_offset, GELF_R_SYM(rela.r_info), elf_strptr(elf, shdr_rela.sh_link, sym.st_shndx));
    }
    elf_end(elf);
    close(fd);
    return 0;
}

如何检索 ELF 可执行文件中存在的 RELA 的名称?

最佳答案

elf_strptr() 调用中有两个不正确的参数。要查找符号名称,请使用:

elf_strptr(elf, shdr_sym.sh_link, sym.st_name)

说明:名字在dynsym段(shdr_sym),而不是rela段,名字的索引由字段st_name标识,而不是st_shndx.

这个答案显然对 OP 来说太晚了,但其他尝试做同样事情的人可能会感兴趣。

关于c - 在 ELF 可执行文件中检索 RELA 的符号名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50270472/

相关文章:

compilation - 编译时错误 "Undefined symbols for architecture x86_64"是什么意思?

C语言。数组左边框 [1..] 而不是 [0..]

python - Pandas 并排堆积条形图

python - 使用 Hist 函数在 Python 3d 图中构建一系列一维直方图

python - 将图像数据集存储到 4D 数组中然后显示每个图像会导致颜色失真

java - java回文客户端程序错误"Cannot find symbol"

java - 需要标识符吗?

c - 如何将字符更改为整数?

c - 可以像这样运行 scanf 吗?

c - 如何使用 minilibx 进行编译?