我读过PE和COFF规范,Matt的“窥视PE: Win32便携式可执行文件格式之旅”和“深入研究Win32便携式可执行文件格式”,以及关于这个主题的其他几个来源。
我能够从MinGW GCC 4.7生成的对象文件中读取COFF节表和COFF符号表(我是在调试模式下编译静态库)。
我的最终目标是访问在给定对象文件(COFF)中定义的所有函数,并读出组成它们的机器代码的所有字节。
问题1:如何计算COFF文件中单个函数的起始地址?我认为我必须以某种方式使用符号记录的"Value“字段作为"SectionNumber”指定部分的偏移量。
问题2:如何找到任何给定函数的长度(需要读取多少字节)?
问题3:根据微软的PE & COFF规范,在定义函数的每个符号记录之后应该有一个辅助符号表记录。为什么在我的对象文件(从在调试模式下编译的.a文件中提取的)中,只有一个函数具有这样的辅助记录?那也是完全充满了零?
发布于 2014-09-14 16:42:12
Q1:是的,这似乎是合理的。
Q2:可能很难。取决于处理器架构。不能保证有任何函数信息给出函数的长度--特别是,x86 (32位)似乎没有可用的任何信息,而且关于长度的信息有时只在异常后展开所需的其他体系结构上可用。
最好的方法可能只是加载符号表,并按地址顺序查找下一个函数的位置,然后假设长度是从函数的开始到下一个函数之前的字节。对于最后一个函数,显然是“直到部分结束”。许多年前,我使用了识别返回指令的方法来查找函数的长度,但是现代编译器通常生成具有多个返回指令的代码,在返回后放入if / etc代码,然后跳转到主函数代码,等等,所以它可能不是一个可靠的方法[当然,如果有人执行x = $0xc3;,0xc3看起来就像一个返回指令,但它实际上是数据.;)
Q3:辅助记录完全是可选的:
零个或多个辅助符号表记录立即跟随每个标准符号表记录.但是,通常不超过一个辅助符号表记录遵循一个标准符号表记录(除了长文件名的.file记录)。
如果有辅助符号表记录,则在符号表记录中在偏移量17处指示它们。
如果您只阅读后面的文本,这可能会令人困惑:
辅助符号表记录总是遵循并应用于一些标准符号表记录。
我认为这应该被视为“如果有一个辅助符号-表记录,它会立即出现在标准表记录之后”。
https://stackoverflow.com/questions/25835259
复制相似问题