获取指令地址的方法有哪些? 我曾经尝试过标记指令并获取标签的地址,但似乎只能在GCC编译器中使用&&运营商。 (参考:this article)如果有其他编译器怎么办?
对这个问题的任何想法?
答案 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提供了它。