compiler-construction - 给定一个指令地址,能否确定包含它的函数的起始地址?

标签 compiler-construction x86 reverse-engineering decompiling disassembly

我在当前的项目中遇到了这个问题,这需要在二进制级别对代码进行推理。

我认为我们可以通过查看 CALL 指令的操作数来确定程序中所有函数的起始位置。有了这个列表后,我们是否可以通过简单地向后搜索直到找到起始地址来确定哪个函数包含一个地址? IE是指令所在函数的起始地址小于指令地址的最大函数地址?

如果上述方法不正确,是否有其他方法可以找到指令所在函数的起始地址?

编辑: 添加了问题的说明。

编辑2: 我的方法可能是错误的。编译器不能保证将函数体放置在机器代码的连续区域中。

最佳答案

您需要更多地限制您的问题空间。即使仅局限于“编译语言的输出”,如今的编译器也善于模糊函数之间的界限。内联意味着一个函数可以包含在另一个函数中。尾调用优化无需 CALL 指令即可在两个函数之间转移控制。配置文件引导的优化可以创建不连续的函数。代码流分析和 noreturn 提示可能会导致代码掉落到数据中。跳转表意味着数据可以在没有 CALL 目标的情况下落入代码。唯一可靠的方法是让编译器明确告诉您指令到函数的映射,比如通过调试信息。您没有说您使用的是什么平台,因此很难提供更具体的信息。

关于compiler-construction - 给定一个指令地址,能否确定包含它的函数的起始地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10792402/

相关文章:

c++ - 使用 intel 编译器编译 DLL 时出错

c - 乱序执行——它能绕过控制语句吗?

c - 逆向工程时结构中的数据类型

unicode - 如何诊断和逆转(而非阻止)Unicode 损坏

c# - Roslyn C# 编译器是如何引导的?

compiler-construction - Less不能使用Twitter Bootstrap编译文件

组装 8086 - DOSBOX - 如何发出蜂鸣声?

c - 代码中的函数会使速度变慢吗?

gcc - 设置执行原始二进制文件的起始地址

linux - 如何在Linux上打开端口以运行应用程序