代码之家  ›  专栏  ›  技术社区  ›  최동규

如何在结构“Elf64\u Rela”中获取符号名称

  •  3
  • 최동규  · 技术社区  · 7 年前
    #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;
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Florian Weimer    7 年前

    并非所有的重新定位都涉及符号,因此您需要检查 ELF64_R_TYPE (p->r_info) 第一具有符号的重新定位集是特定于架构的。

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