- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已阅读 PE and COFF specification , Matt Pietrek 的 "Peering Inside the PE: A Tour of the Win32 Portable Executable File Format"和 "An In-Depth Look into the Win32 Portable Executable File Format"以及有关该主题的其他几个来源。
我能够从 MinGW GCC 4.7 生成的目标文件中读出 COFF 节表和 COFF 符号表(我在 Debug模式下编译静态库)。
我的最终目标是访问给定目标文件 (COFF) 中定义的所有函数并读出构成其机器代码的所有字节。
问题 1:如何计算 COFF 文件中单个函数的起始地址?我想我必须以某种方式使用符号记录的“值”字段作为“SectionNumber”指定部分的偏移量。
问题 2:我如何找出任何给定函数的长度(我必须读取多少字节)?
问题 3:根据微软的 PE & COFF 规范,在每个定义函数的符号记录之后应该有一个辅助符号表记录。为什么在我定义的三个函数的目标文件(从 Debug模式下编译的.a文件中提取)中只有一个有这样的辅助记录?那也完全被零填满了吗?
最佳答案
Q1:是的,这似乎是合理的。
Q2:可能很难。取决于处理器架构。不能保证有任何函数信息给出函数的长度——特别是,似乎没有任何可用于 x86(32 位)的信息,并且关于长度的信息有时仅在其他体系结构上可用[当需要在异常后展开时]。
最好的方法可能就是加载符号表,按地址顺序找到下一个函数的位置,然后假设长度是从函数开始到下一个函数之前的字节。对于最后一个功能,显然是“直到本节结束”。很多年前,我使用识别返回指令的方法来查找函数的长度,但是现代编译器经常生成具有多个返回指令的代码,将 if/else 代码放在 return 之后,并跳转回 main 函数代码等,所以它可能不是一个可靠的方法 [当然如果有人这样做了 x = $0xc3;
,0xc3 看起来像是一个返回指令,但它实际上是数据......;)
Q3:辅助记录完全是可选的:
Zero or more auxiliary symbol-table records immediately follow each standard symbol-table record. However, typically not more than one auxiliary symbol-table record follows a standard symbol-table record (except for .file records with long file names).
如果有辅助符号表记录,它们在符号表记录中的偏移量 17 处指示。
如果您只阅读后面的文字,这可能会造成混淆:
Auxiliary symbol table records always follow, and apply to, some standard symbol table record.
我认为这应该被视为“如果有一个辅助符号表记录,它紧跟在标准表记录之后”。
关于c++ - 如何从 COFF 目标文件中读取函数代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25835259/
我是一名优秀的程序员,十分优秀!