2010-11-05 74 views
8

有没有人有任何建议的装配文件分析工具?我试图在通过-S选项时分析由LLVM(或者GCC)生成的ARM/Thumb-2 ASM文件。我对基本块级的指令统计特别感兴趣,例如,内存操作计数等。我可能会用Python自己编写工具,但在开始之前很好奇看看是否有任何现有的工具。装配分析工具

更新:我已经做了一些搜索,并找到了反汇编工具/十六进制编辑器/ etc的很好资源here,但不幸的是它主要集中在x86汇编上,也不包括任何实际的汇编文件分析器。

+0

分析LLVM IR的方法会更容易,因为它使用寄存器的SSA格式。 – delnan 2010-11-05 23:20:44

+0

@delnan我同意,但我添加了一个汇编级别的优化通行证,所以我需要能够分析实际生成的ASM。 – Zeke 2010-11-05 23:21:44

+0

我是否可以建议您的通行证既可以作为LLVM MachineFunctionPass工作,也可以在MC基础架构内部完成必要工作?真的没有理由解析asm,重建所有的控制和数据流信息,然后做一些优化。 – ohmantics 2010-12-01 18:35:52

回答

2

您需要的是一种可以定义汇编语言语法,然后构建定制分析器的工具。你的分析器可能很简单(“指令需要多少空间?”)或者复杂(“这个指令需要执行多少个周期?”[这取决于前面的指令序列,也可能是一个复杂的处理器模型关心])。

专门为此设计的是New Jersey Machine Toolkit。它的确设计用于构建代码生成器和调试器。我怀疑它会擅长“指令字节数”。目前还不清楚它是否擅长更复杂的分析。我相信它坚持要遵循语法风格,而不是你的。

一个没有专门设计来做到这一点,但一般在解析/分析语言是我们的 DMS Software Reengineering Toolkit

可以给DMS几乎任何上下文无关语言(涵盖大多数汇编语言语法)的语法描述,然后可以将该语法的特定实例(汇编代码)解析为AST以供进一步处理。我们已经完成了几个汇编语言,包括IBM 370,摩托罗拉的8位CPU线,以及一个相当独特的DSP,没有任何问题。

您可以轻松地为DMS指定属性语法(通过AST计算)。这些编码只需要本地信息的分析的好方法,比如“这条指令有多大?”。对于更复杂的分析,您需要一个处理器模型,它是由一系列指令驱动的;通过这样一个机器模型ASTs个别指令将是一个简单的方法来应用机器模型来计算更复杂的事情,如“这条指令需要多长时间?”。

其他分析(如控制流和数据流)由DMS以通用形式提供。您可以使用属性评估器来收集本地事实(本指令的“control-next”,“来自此指令的数据流向......”)并将它们提供给流量分析器以计算全局流量事实( “如果我执行这条指令,下游可能执行哪些指令?”)

您必须为您的特定(汇编)语言配置DMS。这是设计被配置为这些任务。

是的,你可能会用Python编写所有这些代码;毕竟,它是一台图灵机。但可能不那么容易。

其他好处:DMS愿意根据您的分析将转换应用于您的代码。所以你也可以实现你的优化器。毕竟,您需要将优化是安全的分析指示连接到实际的优化步骤。

+0

感谢您的链接和迷人的TechTalk。我认为DMS对我的特殊情况可能是过度的,但这个概念本身非常有趣。使用DMS时学习曲线有多陡峭? – Zeke 2010-11-08 17:48:48

+0

DMS是一个复杂的系统,因为它处理复杂的工件,并且执行一些非常复杂的事情(对2500万行C代码进行流分析需要一些非常惊人的机器)。您可以在一周内了解基础知识;请查看http://www.semanticdesigns.com/Products/DMS/SimpleDMSDomainExample.html以便快速浏览基础知识。使用DMS可能需要6-12个月的时间才能成为好的*;想想学习曲线,以善于使用C++。这可能不是思考DMS的正确方法;真正的问题是,需要多长时间才能完成同样的任务? – 2010-11-08 18:05:52

+0

尽管它看起来并不是免费的,因此它可能不适合个人项目/自由软件项目。或者我错了,只是错过了“下载”链接?看起来像一个很酷的工具,但。 – 2010-11-12 09:20:38

2

我写了很多反汇编,包括手臂和拇指。不是生产质量,而是为了学习汇编程序。对于ARM和Thumb,ARM ARM(ARM体系结构参考手册)都有一个很好的图表,您可以轻松地从加载/存储等中统计数据操作,可能需要花费数小时的工作时间,可能是两个小时。至少在前面,你最终会计算数据值。

另一张海报可能是正确的,就像我在谈论的图表应该很简单,编写一个程序来检查ASCII寻找ldr,str,add等。如果你是需要解析所有东西的话对内存操作计数感兴趣等。当然,缺点是你很可能无法检查循环。一个函数可能有一个加载和存储,另一个函数可能有一个加载和存储,但是它被一个循环包装,一旦执行就会导致更多的内存操作。

不知道你真的感兴趣,我的猜测是你可能想模拟代码并计算这些类型的东西。我写了一个拇指模拟器(thumbulator),试图做到这一点。 (并且我用它来比较llvm执行和gcc执行,当涉及到执行指令的数量,提取,内存操作等等时)。问题可能是它只是拇指,没有ARM没有Thumb2。 Thumb2可以比ARM更容易添加。 arm中有一个armulator,它位于gdb的其他地方。我现在不记得它是否执行thumb2。我的理解是,当arm使用它时会准确地告诉你这些统计数据。

+0

你没有称它为“Thimbleulator”? – 2010-11-19 02:22:16

1

您可以将统计信息插入LLVM代码生成器,它非常灵活,并且已经在收集一些统计数据,可以用作示例。