获取C / C ++中的指令地址

时间:2012-07-17 20:45:24

标签: c base-address

获取指令地址的方法有哪些? 我曾经尝试过标记指令并获取标签的地址,但似乎只能在GCC编译器中使用&&运营商。 (参考:this article)如果有其他编译器怎么办?

对这个问题的任何想法?

4 个答案:

答案 0 :(得分:4)

我不确定C或C ++语言标准是否涉及指令;你可以想象,你可以运行一个编译成由一大群人类奴隶执行的C程序(但即使符合标准,这也是不道德的)。你可以自己运行一个带铅笔和纸的简单小程序,你可以使用C语言翻译等......等等......

优化的C或C ++编译器还会将一些C语句转换为位于不同位置的多个机器指令(特别是,编译器执行内联或克隆功能甚至基本块,即使源中没有任何inline关键字也是如此码)。

在大多数系统中,您可以手动编写代码(例如在汇编程序中)一个例程,该例程作为指针值返回其返回地址(即调用者的地址)。

使用GCC(和兼容的编译器,也许是Clang / LLVM),您可以使用__builtin_return_address和相关的内置函数。

Linux上的Gnu Libc为你提供了backtrace(但是当我尝试的时候,我已经对它感到沮丧。)

请注意,使用-fno-frame-pointer

进行编译时,这些技巧可能无效

您也可以考虑自定义GCC,例如使用插件或MELT扩展(MELT是一种特定于域的语言,实现为GCC的GPLv3插件,比使用C编码的插件更容易扩展GCC)。您的自定义GCC可能会在适当的位置插入对检测功能的调用。

答案 1 :(得分:2)

警告:此处开箱即用..

您是否可以让链接器生成包含应用程序对象(函数和数据)的地址(相对或其他)的映射文件?然后,您的应用程序可以简单地解析链接器映射文件......

答案 2 :(得分:0)

唯一标准的C或C ++构造甚至接近指令的地址是一个函数指针,我想这不是你的意思。但是,您可以使用gcc标签值完成大部分操作,而不是使用指向包含必要代码块的函数的指针。

C / C ++中没有其他选项。

答案 3 :(得分:0)

函数的返回地址是从当前函数返回时要执行的下一条指令的位置。 GCC通过__builtin_return_address公开了此内容;而Visual C ++通过_ReturnAddress提供了它。