7

有什么方法可以获取指令的地址?我曾尝试用来标记指令并获取标签的地址,但似乎它仅适用于带有 && 运算符的 GCC 编译器。(参考:这篇文章)如果其他编译器呢?

对这个问题有任何想法吗?

4

4 回答 4

4

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

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

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

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

Linux 上的 Gnu Libc 为您提供回溯(但当我尝试时,我被它失望了)。

请注意,这些技巧在编译时可能不起作用-fno-frame-pointer

您还可以考虑使用插件或MELT扩展来定制 GCC(MELT 是一种特定于领域的语言,作为 GCC 的 GPLv3 插件实现,比使用 C 编码的插件更容易扩展 GCC)。您定制的 GCC 可能会在适当的位置插入对检测函数的调用。

于 2012-07-17T20:56:01.780 回答
2

注意:这里开箱即用..

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

于 2012-07-17T21:09:56.727 回答
0

唯一接近指令地址的标准 C 或 C++ 构造是函数指针,我想这不是您的意思。但是,您可以使用指向包含必要代码块的函数的指针来完成大多数可能对 gcc 标签值执行的操作。

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

于 2012-07-17T21:06:50.153 回答
0

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

于 2020-02-05T21:29:28.427 回答