插入C结构函数指针

时间:2018-11-29 09:29:28

标签: c++ c macos

我正在尝试将声明为指针的函数插入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:(

中的函数指针出了什么问题

1 个答案:

答案 0 :(得分:2)

如果我的理解正确,您希望对sub(或更确切地说_Z3subP7AStructii)的所有调用实际上是在调用_sub函数?问题在于,当“客户端”调用some_astruct->sub(...)时,它实际上并没有直接调用_Z3subP7AStructii,因此不会调用您的_sub函数。

换句话说,“客户端”没有呼叫_Z3subP7AStructii,而是呼叫了some_astruct->sub指向的对象。 _Z3subP7AStructii库甚至无法导出libA函数(即与static具有内部链接),并且仍可以通过结构调用它。

对此的可能解决方案不是“插入” sub函数,而是“ AStruct_create”函数。在您的版本中,请调用原始文件,然后将结构中的sub函数的指针替换为您自己的函数(可以保存原始文件以便使用)。