C语言中用于函数原型dlsym的typedef

3

我正在编写一个共享库,用于在 Linux 中 LD_PRELOAD 并拦截现有库的某些调用。

我有约 50 多个不同的函数原型和属性声明要编写,希望代码尽可能简短,因为函数原型非常大。

我的问题是:假设我想拦截对 doStuff(int,void*) 的所有调用

我有以下代码:

头文件:

typedef int (*doStuffPrototype) (int, void*);
extern doStuffPrototype dlSym_doStuff;
extern int doStuff(int, void*);

C文件

doStuffPrototype dlSym_doStuff;
__attribute__((constructor)) void libSomething() {
    void* lib_ptr;
    dlerror();
    lib_ptr = dlopen(LIB_NAME, RTLD_LAZY);
    ...
    // Loading all references to the real library
    dlSym_doStuff = (doStuffPrototype) dlSym(lib_ptr, "doStuff");
}

好的,现在这个工作正常,但我想要替换头部中的以下行:

extern int doStuff(int, void*);

可以使用类似以下方式:

extern doStuffPrototype doStuff;

但是我遇到了一个问题

'doStuff' 重新声明为不同类型的符号

因为它已经在真实的库中声明过了......但是......它在当前语法下没有问题......只是我必须再次写出参数...... 如果我去掉typedef中的解引用:

typedef int (doStuffPrototype) (int, void*);

那么extern doStuffPrototype doStuff;是可行的,但是dlSym_doStuff = (doStuffPrototype) dlSym(lib_ptr, "doStuff");无法编译...

我尝试了很多事情:这可能吗?


它会崩溃还是无法编译? - Deduplicator
无法编译... 我会在问题描述中说明 - doctor killer
1个回答

0

很明显

typedef int (*doStuffPrototype) (int, void*);

并且

typedef int (doStuffPrototype) (int, void*);

创建略有不同的typedef

我的建议是创建两个不同的typedef并适当使用每个。

typedef int (doStuffPrototype) (int, void*);
typedef doStuffPrototype* doStuffPrototypePtr

然后像这样使用它们:

extern doStuffPrototypePtr dlSym_doStuff;
extern doStuffPrototype doStuff;

...


dlSym_doStuff = (doStuffPrototypePtr) dlSym(lib_ptr, "doStuff");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接