2012-03-08 17 views
3

私は関数ポインタの配列を公開する共有ライブラリを構築しました。関数定義はこのライブラリにもありますが、エクスポートされません。Cの共有ライブラリからのアクセスポインタ

別のプログラムからこのライブラリをロードし、エクスポートされたポインタを使用してこれらの関数を直接呼び出すことはできますか?

これは私がやろうとしていることです。

マイライブラリ:

#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障害を与える:

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

私はこのようにそれを使用しようとしています。

答えて

0

はい、もちろんです。 dlsymはシンボルテーブル内の関数名をルックアップしてアドレス(関数ポインタ)に変換するので、関数ポインタの独自のテーブルを構築することで、これを手動で行うだけです。

1

愚かな間違いだったようです。今期待通りに働いている

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

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

は次のようなものであるべき。

関連する問題