在反汇编中,需要识别每个子程序的起始和结束地址。 x86中出现的一个问题(不是100%肯定)是子程序的地址空间可能是非连续的。到目前为止,我在ARM反汇编中找不到这样的子程序。
ARM ELF 始终 中的子程序通常占用连续的地址空间吗?
更新:
我对二进制文件的静态分析感兴趣。对于比例的任何静态分析,同时保持精度,它应该依赖于合理的假设。对于由一组基本块BB_1组成的函数,如果它跳转到远离内存的另一组基本块BB_2,我们可以悲观地将BB_2视为我们目的的另一个函数。但是,如果我们可以将BB_2识别为一组遵循常见习语的基本块,例如清理。这可以有所作为。因此,如果识别这些习语以及它们在实践中的使用方式,那将是非常有用的。
答案 0 :(得分:1)
我不知道任何"这样的规则"但是你应该首先在反汇编的上下文中定义你所谓的开始和子程序结束。 正如@Notlikethat已经提到的那样 - 有一些由编译器和/或链接器生成的结尾/清理 - 你认为它们是子程序的一部分吗?这里没有简单的答案。 在ARM平台上,使用'胶合代码(拼写?懒惰检查)来确保正确的ARM / Thumb交互是很常见的 - 你会认为它们是子程序的一部分吗?它们在记忆中绝对可以相隔数英里。
<强> UPD。强>
ARM ELF中的子程序通常占用连续的地址空间吗?
根据我的经验(使用gcc工具链),简短的回答是:
是 - 如果关闭gcc优化。
但如果优化是开启的 - 你完全不能依赖它
现代优化编译器/链接器允许执行任何“脏”操作。感觉合适的技巧..而且确实如此
在您的问题的上下文中 - 没有什么能阻止它在两个(或更多)函数中检测代码的公共部分,并重新组织代码以跳转到该部分,从而避免代码重复。
希望这有帮助。