【问题标题】:Getting the "real" function from a method pointer从方法指针获取“真实”函数
【发布时间】:2014-01-10 06:27:14
【问题描述】:

给定一个指向虚拟方法的 c++ 对象指针和兼容的方法指针,是否有任何远程稳健/可移植的方法来获取指向将被调用的实际 Concert 函数的指针?

用例是我想运行所说的指针认为调试符号来获取将被调用的类型/函数的名称(而不实际调用它)。

如果这只能通过特定于实现的解决方案来实现,那么我主要对支持 GCC/LLVM 感兴趣。

【问题讨论】:

  • 看看stackoverflow.com/questions/77005/…。这可能会有所帮助。
  • @cup 看起来涵盖了我已经或多或少知道如何处理的“给定指针,获取可用字符串”位。

标签: c++ portability introspection debug-symbols


【解决方案1】:

LLVM 和 GCC 都遵循Itanium C++ ABI,因此您需要找到一种方法来读取其中指定的数据结构。我会给出一个粗略的大纲。
指向虚拟成员的指针由虚拟函数表的偏移量表示,出于某种原因 +1。

class A {
public:
    virtual void f();
    virtual void g();
};

void (A::*pAg)() = & A::g;
ptrdiff_t offset = *(ptrdiff_t*)(&pAg) - 1;

指向虚拟表的指针通常位于对象的开头:

A a;
void* vtable = *(void**)&a;

然后您查看该虚拟表中的计算偏移量并找到您的实际函数指针。

void* function = *(void**)(vtable+offset)

【讨论】:

  • 一旦我放弃了对出现便携式解决方案的绝望希望,我会尝试一下。
猜你喜欢
  • 1970-01-01
  • 2014-11-04
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多