【问题标题】:access to symbol table - Segmentation fault访问符号表 - 分段错误
【发布时间】:2023-03-03 17:30:01
【问题描述】:

我正在编写一个调试器,我需要访问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);
....

【问题讨论】:

  • 也许你应该在你的调试器上使用一个调试器来看看它为什么会崩溃......:D
  • 我试图调试,但我没有足够的信息来理解它为什么会崩溃,我试图弄清楚这是否是获取符号表的正确方法,我可以从这里继续

标签: c debugging elf symbol-table


【解决方案1】:

FILE* file= fopen(argv[1],"r") 不会将文件的内容读入内存。返回的指针file 没有指向任何类似于文件数据的东西。它指向一个抽象数据结构,可以将其传递给系统库函数,如fread(),它们会从文件中读取数据。

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

【讨论】:

  • 不幸的是,我不允许使用 mmap 或 readelf 或任何其他有用的库
  • 还有其他方法可以访问符号表吗? (为了搜索特定的符号)
  • @dana:自己将数据读入自己的缓冲区。
  • 'FILE* file= fopen(argv[1],"r"); Elf64_Ehdr 标头; fread(标题,sizeof(标题),1,文件); Elf64_Shdr *section = (Elf64_Shdr)(header+header->e_shoff);'
  • @dana 您应该尝试理解您正在编写的代码。 Elf64_Shdr *section ... 部分显然是伪造的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 2013-11-18
  • 2020-02-06
  • 1970-01-01
相关资源
最近更新 更多