在C语言中读取ELF头

在C语言中读取ELF头,c,linker,elf,C,Linker,Elf,目前我正在编写一个小程序,读取elf文件头并打印一些信息 我有一个名为buf的无符号字符指针,它指向elf文件在内存中的位置(我使用mmap将它映射到内存),然后我将它键入一个适当的elf头指针 Elf32_Ehdr *ehdr = (Elf32_Ehdr *)buf; 在这之后,我想得到程序头表的地址,我这样做 Elf32_Phdr *ptbl = (Elf32_Phdr *) (buf + ehdr->e_phoff) fprintf( stdout , "Offset of pr

目前我正在编写一个小程序,读取elf文件头并打印一些信息

我有一个名为buf的无符号字符指针,它指向elf文件在内存中的位置(我使用mmap将它映射到内存),然后我将它键入一个适当的elf头指针

Elf32_Ehdr *ehdr = (Elf32_Ehdr *)buf;
在这之后,我想得到程序头表的地址,我这样做

Elf32_Phdr *ptbl = (Elf32_Phdr *) (buf + ehdr->e_phoff)
fprintf( stdout , "Offset of program headers : %d\n", ehdr->e_phoff);
我注意到ptbl指针的值没有改变,当我试图像这样打印e_phoff成员的值时

Elf32_Phdr *ptbl = (Elf32_Phdr *) (buf + ehdr->e_phoff)
fprintf( stdout , "Offset of program headers : %d\n", ehdr->e_phoff);
我得零分 当我试图打印程序头和节头的数量时,也会发生同样的情况-总是得到零 如果我使用LinuxReadelf,它会打印正确的值
是否有人遇到过相同的问题?

解析ELF对象时,您需要记住:

  • 文件内结构(如ELF可执行文件头)的大小、文件对齐方式和内部布局取决于ELF对象的字大小
  • ELF对象的endianness可能不同于读取该对象的程序的“本机”endianness
  • 包含大量节或程序段的ELF对象可以使用替代的“扩展编号”方案
  • 与手动处理这些情况相比,使用ELF(3)访问API的实现来解析ELF对象可能更容易(请参见:,或)


    教程```包含一个易读的ELF(3)API介绍。

    我想我发现了问题,我使用的是64位机器,所以我刚刚将Elf32_Phdr更改为Elf64_Phdr,它可以提前回答您自己的问题。如果你先找到答案,这是一件有道理的事情。显然,您使用了错误的结构指针类型,因此您引用了预期的上游内存。我建议使用libelf。您可以共享您的代码吗?谢谢,伙计,我只是在玩这个示例,以便更深入地了解什么是ELF,无论如何,感谢有用的链接