gpt4 book ai didi

c - 如何获取结构 "Elf64_Rela"中的符号名称

转载 作者:太空宇宙 更新时间:2023-11-03 23:41:07 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

关于c - 如何获取结构 "Elf64_Rela"中的符号名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45319775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com