在C中读取ELF头

时间:2012-04-27 14:43:54

标签: c linker elf

目前我正在编写一个小程序来读取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,它会输出正确的值 有没有人遇到过同样的问题?

1 个答案:

答案 0 :(得分:5)

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

  1. 文件内结构(例如ELF可执行文件头)的大小,文件对齐和内部布局取决于ELF对象的字大小。
  2. ELF对象的字节顺序可能与读取对象的程序的“本机”字节顺序不同。
  3. 包含大量部分或程序段的ELF对象可以使用备用“扩展编号”方案。
  4. 不是手动处理这些情况,而是使用ELF(3)访问API的实现来解析ELF对象可能更容易(参见:BSD libelfGNU libelf)。 / p>

    教程“libelf by Example”包含对ELF(3)API的可读介绍。