我构建了一个共享库,它暴露了一个函数指针数组。函数定义也在此库中,但不会导出它们。
是否可以从其他程序加载此库并直接使用导出的指针调用这些函数?
这就是我要做的事。
我的图书馆:
#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();
}
这给出了段错误。
答案 0 :(得分:1)
这似乎是一个愚蠢的错误。
void (*myptr)() = (void (*)()) dlsym(lib, "myptr");
应该是这样的:
void ** myptr = (void**)dlsym(lib, "myptr");
void (*fcn)() = (void (*)()) (*myptr);
现在按预期工作。
答案 1 :(得分:0)
是的,当然。 dlsym
在符号表中查找函数名称以将其转换为地址(函数指针),因此通过构建自己的函数指针表,您只需手动执行此操作。