我看到二进制翻译通常是基于跟踪的。是因为人们无法获得功能的界限吗?二进制代码中是否有功能标签?
答案 0 :(得分:2)
对此没有简单的答案。您可以搜索ret
指令,但不能保证它们是函数边界,因为您可以从函数中间返回。
搜索
之类的内容mov ebp, esp
会在某种程度上发挥作用,但同样,这并不能保证。
一些编译器(最着名的是英特尔编译器)会在函数结束后将分支块移动到,然后跳回到函数中......
答案 1 :(得分:0)
基于痕迹的意思是什么?你问题的基本答案是否定的,机器码中没有功能标签。可能存在特定于您可以查找的每个编译器的模式,您还可以使用可执行格式在代码中查找公共函数的入口点。但是现在编译器可以进行整个程序优化,模糊了机器代码级别的函数概念。
答案 2 :(得分:0)
查找C函数的开始和结束地址的常用方法是打印出内存映射并扫描函数的开头。许多编译器将在内存映射中指定函数长度。
某些编译器提供#pragma
或预处理关键字,以允许您将函数分配给特定地址。
抱歉,C语言只提供函数的起始地址;不是他们的长度。