我正在尝试将声明为指针的函数插入macOS上动态库中的C结构中。
我在libA.dylib中有这个结构:
libA.h:
typedef struct AStruct {
int (*sub)(AStruct *pAStruct, int a, int b);
} AStruct;
extern "C" AStruct * AStruct_new();
libA.cpp:
int sub(AStruct *pAStruct, int a, int b) {
return a - b;
}
AStruct * AStruct_new() {
AStruct *pAStruct = (AStruct *)malloc(sizeof(AStruct));
pAStruct->sub = *sub;
return pAStruct;
}
名称重整后,我发现库中的对应名称是:_Z3subP7AStructii
在我的dylib中(我正在将其注入客户端代码),我正在这样做:
typedef struct AStruct {
int (*sub)(AStruct *pAStruct, int a, int b);
} AStruct;
extern "C" int _Z3subP7AStructii(AStruct *pAStruct, int a, int b);
int _sub(AStruct *pAStruct, int a, int b) {
printf("interposed %s: ", __func__);
return pAStruct->sub(pAStruct, a, b);
} DYLD_INTERPOSE(_sub, _Z3subP7AStructii)
DYLD_INTERPOSE
-是here中的Apple宏
同一代码可成功用于常规C函数,C ++静态/实例方法,但无法弄清struct:(
中的函数指针出了什么问题答案 0 :(得分:2)
如果我的理解正确,您希望对sub
(或更确切地说_Z3subP7AStructii
)的所有调用实际上是在调用_sub
函数?问题在于,当“客户端”调用some_astruct->sub(...)
时,它实际上并没有直接调用_Z3subP7AStructii
,因此不会调用您的_sub
函数。
换句话说,“客户端”没有呼叫_Z3subP7AStructii
,而是呼叫了some_astruct->sub
指向的对象。 _Z3subP7AStructii
库甚至无法导出libA
函数(即与static
具有内部链接),并且仍可以通过结构调用它。
对此的可能解决方案不是“插入” sub
函数,而是“ AStruct_create
”函数。在您的版本中,请调用原始文件,然后将结构中的sub
函数的指针替换为您自己的函数(可以保存原始文件以便使用)。