给定一个c ++对象指针和指向虚方法的兼容方法指针,是否有任何远程健壮/可移植的方式来获取指向将被调用的实际Concert函数的指针?
用例是我想运行所述指针认为调试符号获取将被调用的类型/函数的名称(实际上没有调用它)。
如果这只能通过特定于实现的解决方案实现,那么我主要对支持GCC / LLVM感兴趣。
答案 0 :(得分:0)
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)