c - 在 C 中读取 ELF 头文件

标签 c linker elf

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

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

Elf32_Ehdr *ehdr = (Elf32_Ehdr *)buf;

在这之后我想得到一个程序头表的地址,我是这样做的

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

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

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

我得到零 当我尝试打印程序标题的数量和节标题的数量时,同样的事情发生了——总是得到零 如果我使用 linux readelf,它会打印正确的值 有没有人遇到过同样的问题?

最佳答案

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

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

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

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

关于c - 在 C 中读取 ELF 头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10352768/

相关文章:

c - 即使我关闭所有管道,读取也没有收到 EOF C

c - 某些输入出现段错误,其他输入则不出现段错误

c++ - 用于在整个文件系统中搜索文件的 POSIX 程序

c++ - 链接错误 CString

linux - 如何删除 ELF 文件中的节头表?

c++ - 使用复合赋值运算符解决转换警告

visual-c++ - VC++ 2010 想要链接我什至没有指定的 boost 库

static - 与静态库与单个目标文件的链接

linux - 如何查找 ELF 的程序头数量

Python 选项解析器覆盖 '-h'