获取指令地址的方法有哪些?我曾经尝试过标记指令并获取标签的地址,但似乎它只适用于带有&&运算符的GCC编译器.(参考:本文)如果有其他编译器怎么办?
对这个问题的任何想法?
我不确定 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 可能会在适当的位置插入对检测函数的调用。
归档时间: |
|
查看次数: |
4026 次 |
最近记录: |