有时候,需要把c++的类成员函数,当作函数指针返回,并且在外部转换成任何类型的函数指针去调用,可是又不能直接把类成员函数转换成指针,那么就需要用到如下方法:
//arm开发板demo
class Test{
private:
uint64_t address{};
public:
Test(){}
void* func(){
//使用内联汇编,接收测试参数方便一些
uint64_t x0, x1, x2, x3, x4, x5, x6, x7;
uint64_t arg8;
asm volatile (
"mov %0, x0\n" // 读取x0通用寄存器
"mov %1, x1\n" // 读取x1通用寄存器
"mov %2, x2\n" // 读取x2通用寄存器
"mov %3, x3\n" // 读取x3通用寄存器
"mov %4, x4\n" // 读取x4通用寄存器
"mov %5, x5\n" // 读取x5通用寄存器
"mov %6, x6\n" // 读取x6通用寄存器
"mov %7, x7\n" // 读取x7通用寄存器
: "=r" (x0), "=r" (x1), "=r" (x2), "=r" (x3),
"=r" (x4), "=r" (x5), "=r" (x6), "=r" (x7), "=r" (x8)
:
:"memory"
);
LOGD("x0: %#lx", x0);
LOGD("x1: %#lx", x1);
LOGD("x2: %#lx", x2);
LOGD("x3: %#lx", x3);
LOGD("x4: %#lx", x4);
LOGD("x5: %#lx", x5);
LOGD("x6: %#lx", x6);
LOGD("x7: %#lx", x7);
return (void*)123456;
}
void* ret_func_ptr(){
union {
void* (Test::*member_func)();
void* generic_ptr;
} u{};
u.member_func = &Test::func;
return u.generic_ptr;
}
};
int main(){
Test t;
// 获取成员函数指针
void* ptr = t.ret_func_ptr();
auto ret = (std::uint64_t)((void*(*)(int,int,int,int,int,int,int,int))ptr)(0x123456,0x7894561,0x66666,0x66666,0x123456,0x7894561,0x66666,0x66666);
LOGD("ret:%lu",ret);
}