从C中的共享库访问指针

时间:2012-03-08 16:40:31

标签: c pointers shared-libraries

我构建了一个共享库,它暴露了一个函数指针数组。函数定义也在此库中,但不会导出它们。

是否可以从其他程序加载此库并直接使用导出的指针调用这些函数?

这就是我要做的事。

我的图书馆:

#include <stdio.h>
void myfun(){
    printf("myfun\n");
}
extern void (*myptr)() = myfun;

我试图像这样使用它:

#include <dlfcn.h>
int main(){
    void * lib = dlopen("libt1.so", RTLD_NOW);
    if(!lib) { printf("%s\n", dlerror()); return 0; }
    void (*myptr)() = (void (*)()) dlsym(lib, "myptr");
    if(!myptr){ printf("%s\n", dlerror()); return 0; }
    printf("%p\n", myptr);
    myptr();
}

这给出了段错误。

2 个答案:

答案 0 :(得分:1)

这似乎是一个愚蠢的错误。

void (*myptr)() = (void (*)()) dlsym(lib, "myptr");

应该是这样的:

void ** myptr = (void**)dlsym(lib, "myptr");
void (*fcn)() = (void (*)()) (*myptr);

现在按预期工作。

答案 1 :(得分:0)

是的,当然。 dlsym在符号表中查找函数名称以将其转换为地址(函数指针),因此通过构建自己的函数指针表,您只需手动执行此操作。