![](/img/trans.png)
[英]Is there a tool to obtain info on a particular symbol in an ELF .o or executable file?
[英]Retrieve symbol name of RELA in ELF executable
我正在尝试检索在 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()
的调用中有两个不正确的 arguments 。 要查找符号名称,请使用:
elf_strptr(elf, shdr_sym.sh_link, sym.st_name)
说明:名称在 dynsym 部分( shdr_sym
),而不是 rela 部分,并且名称的索引由字段st_name
而不是st_shndx
标识。
这个答案显然为时已晚,对 OP 没有用处,但其他试图做同样事情的人可能会感兴趣。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.