用C语言读取ELF头文件

7

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

我有一个名为buf的unsigned char指针,它指向elf文件在内存中的位置(我使用mmap将其映射到内存中),然后将其转换为正确的elf头指针。

Elf32_Ehdr *ehdr = (Elf32_Ehdr *)buf;

在此之后,我想获取程序头表的地址,我这样做:

Elf32_Phdr *ptbl = (Elf32_Phdr *) (buf + ehdr->e_phoff)

我注意到ptbl指针的值没有改变,当我尝试像这样打印e_phoff成员的值时:

fprintf( stdout , "Offset of program headers : %d\n", ehdr->e_phoff);

我得到了零

当我尝试打印程序头部和区段头部的数量时,同样会发生这种情况-总是得到零。

如果我使用Linux readelf,它会打印正确的值。

有没有人遇到过同样的问题?


3
我认为我找到了问题所在,我正在使用64位机器,所以我只需将Elf32_Phdr更改为Elf64_Phdr即可解决问题。 - Rustam Issabekov
请回答你自己的问题。如果你先找到了答案,这是一个有效的做法。显然,你使用了错误的结构体指针类型,所以你引用的内存超出了预期。 - Edwin Buck
我建议使用libelf。 - jørgensen
你能分享你的代码吗? - Ursa Major
1个回答

6
解析 ELF 对象时需要注意以下几点:
  1. 文件中结构体(例如 ELF 可执行头)的大小、文件对齐和内部布局取决于 ELF 对象的字长。
  2. ELF 对象的字节序可能与读取对象的程序的“本地”字节序不同。
  3. 包含大量节或程序段的 ELF 对象可能使用备用的“扩展编号”方案。
为了避免手动处理这些情况,更容易的方式是使用 ELF(3) 访问 API 的实现来解析 ELF 对象 (参见:BSD libelfGNU libelf)。
教程“libelf by Example”提供了关于 ELF(3) API 的可读介绍。

谢谢你,伙计。其实我只是玩一下这个例子来更深入地了解什么是ELF,不过还是感谢有用的链接。 - Rustam Issabekov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接