C typedef for function prototype dlsym

时间:2014-06-19 19:00:54

标签: c header-files dlsym

我正在为LD_PRELOAD编写一个共享库,并拦截来自现有库(在linux中)的一些调用。

我有大约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'重新宣布为不同类型的符号

因为它是在真实的库中声明的...但是...它对当前的语法没有问题......我必须重新编写参数... 如果我取消引用offdef:

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

然后extern doStuffPrototype doStuff;有效,但dlSym_doStuff = (doStuffPrototype) dlSym(lib_ptr, "doStuff");无法编译......

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

1 个答案:

答案 0 :(得分:0)

很清楚

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

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

创建略有不同的typedef s。

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

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

并使用它们:

extern doStuffPrototypePtr dlSym_doStuff;
extern doStuffPrototype doStuff;

...


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