2012-03-08 105 views
3

我构建了一个共享库,它公开了一个函数指针数组。函数定义也在这个库中,但它们不会被导出。C中共享库的访问指针

是否有可能从另一个程序加载该库并直接使用导出的指针调用这些函数?

这就是我想要做的。

我的图书馆:

#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(); 
} 

这给出了一个SEGM故障。

回答

0

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

1

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

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

应该是这样的:

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

它正在按目前预计。