2012-07-17 109 views
6

任何获取指令地址的方法? 我试图用标签来说明指令并获取标签的地址,但似乎它只能在GCC编译器中与& &运算符一起使用。 (参考:this article)如果其他编译器呢?获取C/C++指令的地址

这个问题的任何想法?

+0

你为什么问? – 2012-07-17 20:48:15

+4

C++不需要执行指令。 – 2012-07-17 20:48:32

+0

嗨巴西尔,我目前正在对指令/数据监视功能进行一些研究。 – nigong 2012-07-17 20:51:46

回答

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可能会在适当的地方插入调用仪器功能。

+0

嗨巴西尔,谢谢你的回答。但我不是故意说出指示和声明的关系。我想要做的只是获取C/C++语句或指令的地址。 :) – nigong 2012-07-17 20:59:19

+1

@nigong他基本上说甚至可能根本就没有指示。特别是如果它由奴隶而不是CPU来运行的话。 – Mysticial 2012-07-17 21:03:31

+1

如果'指令'和'语句'有相似的概念,这可能是可行的。但是,大多数语句会生成多条指令,这些指令甚至可能不是连续的(循环结构等),并可能与来自其他语句的指令交错(优化,指令调度)。 – twalberg 2012-07-17 21:13:13

0

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

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

2

注意:出路在这里箱子..

你能已链接器生成一个包含应用程序对象(功能和数据)的(相对或其他方式)的地址映射文件?你的应用程序可以简单地解析链接器映射文件...

+0

在Linux上,'dladdr'为你做了这个 - 参见''和'dlopen'),或者至少有很大的帮助。 – 2012-07-17 21:15:11