1

私は自分のライブラリを書きます:

struct utsname Lib;

char *s(){
    uname(&Lib);
    return Lib.sysname;
}

システム名を印刷したい場合:

int main(int argc, char *argv[]){

    void *lib=dlopen(".../Mylib.so",RTLD_LAZY);

    if(!lib)
        dlerror();
    else{
        char *a;
        int opt;
        while((opt = getopt (argc, argv, "sn")) != -1){
            switch(opt){
                case 's':
                    a= (char*)dlsym(lib, "s");
                    printf("test: %s", a);
                break;
            }
        }

    }   

    if(lib)
        dlclose(lib);

return 0;
}

私は次のようなものを得ます:

UH▒▒H▒=▒ 

これは、char a のキャストが間違っていることが原因だと思います。1 つのファイルでテストしたところ、dlsym に割り当てられた char は正常に動作しました。

メイクファイル:

main: mainname.c
    gcc -c -fPIC lib.c
    gcc -shared -fPIC -o lib.so lib.c
    gcc -o main mainname.c -ldl
4

1 に答える 1

0

cremno が述べたように、関数を呼び出しませんでした。

            char *(*s)();
            …
                s = dlsym(lib, "s");
                printf("test: %s", s());

それを行うためのやや読みやすい方法になります。

于 2015-09-10T06:30:31.807 に答える