目前我正在编写一个小程序来读取 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 对象时,您需要记住:
- 文件内结构(例如 ELF 可执行文件头)的大小、文件对齐方式和内部布局取决于 ELF 对象的字长。
- ELF 对象的字节序可能不同于读取该对象的程序的“ native ”字节序。
- 包含大量节或程序段的 ELF 对象可以使用替代的“扩展编号”方案。
与其手动处理这些情况,不如使用 ELF(3) 访问 API 的实现来解析 ELF 对象(请参阅:BSD libelf 或 GNU libelf)。
教程`` libelf by Example '' 包含对 ELF(3) API 的可读介绍。
关于c - 在 C 中读取 ELF 头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10352768/