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,它会打印正确的值 有人遇到过同样的问题吗?

4

1 回答 1

5

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

  1. 文件内结构(例如 ELF 可执行文件头)的大小、文件对齐方式和内部布局取决于 ELF 对象的字长。
  2. ELF 对象的字节顺序可能与读取对象的程序的“本机”字节顺序不同。
  3. 包含大量节或程序段的 ELF 对象可以使用替代的“扩展编号”方案。

与其手动处理这些情况,不如使用 ELF(3) 访问 API 的实现来解析 ELF 对象(请参阅:BSD libelfGNU libelf)。

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

于 2012-04-29T04:05:02.200 回答