Я пытаюсь вставить функцию, объявленную как указатель, в структуру C внутри динамической библиотеки в macOS.
У меня есть эта структура в 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
- это макрос Apple от здесь
того же кодауспешно работает для обычной функции C, статических методов / экземпляров C ++, не может понять, что не так с указателем на функцию внутри структуры: (