访问符号表 - 分段错误

问题描述

我正在编写调试器,我需要访问 symtab,但在运行时出现分段错误(核心转储),问题可能出在我获取 symatb(和标题....) 这是代码

    int main(int argc,char** argv)
    {
        FILE* file= fopen(argv[1],"r");
        Elf64_Ehdr* header = (Elf64_Ehdr*)file;
        Elf64_Shdr *section = (Elf64_Shdr*)(file+header->e_shoff);
    
    for(int i=0; i < header->e_shnum; i++) {
        if(section[i].sh_type==SHT_SYMTAB)
        {
            Elf64_Sym *symtab = (Elf64_Sym *)(file+section[i].sh_offset);
....

解决方法

FILE* file= fopen(argv[1],"r") 不会导致文件内容被读入内存。返回的指针 file 不指向与文件数据类似的任何内容。它指向一个抽象数据结构,该结构可以传递给系统库函数,如 fread(),后者从文件中读取数据。

因此将 file 转换为 Elf64_Ehdr* 没有意义。如果您想将文件映射到内存中(这可能是解决问题的最简单方法),您可以使用 mmap。 (但请注意,mmap 需要由 open() 返回的文件描述符;它不是标准 C 库的一部分,并且它对 FILE 对象一无所知。)