2

我已经阅读了PE 和 COFF 规范、Matt Pietrek 的“PE 内部窥探:Win32 可移植可执行文件格式之旅”“Win32 可移植可执行文件格式的深入研究”以及其他几个关于该主题的资料.
我能够从 MinGW GCC 4.7 生成的目标文件中读出 COFF 部分表和 COFF 符号表(我在调试模式下编译静态库)。
我的最终目标是访问给定目标文件 (COFF) 中定义的所有函数,并读出构成其机器代码的所有字节。

问题一:如何计算COFF文件中单个函数的起始地址?我想我必须以某种方式使用符号记录的“值”字段作为“SectionNumber”指定的部分的偏移量。

问题 2:如何找出任何给定函数的长度(我必须读取多少字节)?

问题3:根据微软的PE&COFF规范,在每条定义函数的符号记录之后应该有一个辅助符号表记录。为什么在我的三个已定义函数的目标文件(从以调试模式编译的 .a 文件中提取)中只有一个具有这样的辅助记录?那也完全被零填满了?

4

1 回答 1

1

Q1:是的,这似乎是合理的。

Q2:可能很难。取决于处理器架构。不能保证有任何函数信息给出函数的长度 - 特别是,似乎没有任何可用于 x86(32 位)的信息,并且有关长度的信息有时仅在其他体系结构上可用[异常后需要平仓时]。

最好的办法大概就是加载符号表,按照地址顺序找到NEXT函数在哪里,然后假设长度是从函数开始到下一个函数之前的字节。对于最后一个函数,显然是“直到部分结束”。很多年前,我用识别返回指令的方法来求函数的长度,但是现代编译器经常生成有多个返回指令的代码,将if/else代码放在return之后,并跳转回主函数代码等,所以它可能不是一个可靠的方法[当然如果有人这样做x = $0xc3;,0xc3 看起来像一个返回指令,但它实际上是数据......;)

Q3:辅助记录完全是可选的:

零个或多个辅助符号表记录紧跟在每个标准符号表记录之后。但是,通常不超过一个辅助符号表记录遵循标准符号表记录(具有长文件名的 .file 记录除外)。

如果有辅助符号表记录,它们在符号表记录的偏移量 17 处被指示。

如果您只阅读后面的文本,这可能会造成混淆:

辅助符号表记录始终遵循并适用于某些标准符号表记录。

我认为这应该被视为“如果有辅助符号表记录,它会立即出现在标准表记录之后”。

于 2014-09-14T16:42:12.323 回答