在C中读取ELF头

Rus*_*kov 7 c linker elf

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

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

Elf32_Ehdr *ehdr = (Elf32_Ehdr *)buf;
Run Code Online (Sandbox Code Playgroud)

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

Elf32_Phdr *ptbl = (Elf32_Phdr *) (buf + ehdr->e_phoff)
Run Code Online (Sandbox Code Playgroud)

正如我注意到ptbl指针的值不会改变,当我尝试打印e_phoff成员的值时,这样

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

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

jko*_*shy 5

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

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

可能更容易使用ELF(3)访问API的实现来解析ELF对象(参见:BSD libelfGNU libelf),而不是手动处理这些情况.

教程" libelf by Example "包含对ELF(3)API的可读介绍.