gpt4 book ai didi

c++ - 如何从 COFF 目标文件中读取函数代码?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:21:20 24 4
gpt4 key购买 nike

我已阅读 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com