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;
Thx。 ELFW関数はどこで宣言されていますか? –
ああ、これはglibcが32ビットと64ビットのコードを統一するために使うショートカットです。 64ビットのみの式に切り替えるつもりです。 –
ELF64_R_SYM(p-> r_info)の戻り値の型は整数です。最終的に、Symtabのシンボルと.rela.dynのシンボルを一致させたいと思います。 –