2012-03-08 136 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); 

它正在按目前預計。