如何打印dlsym()变量?

时间:2015-03-15 16:04:21

标签: c linux dll printf dlsym

我写了自己的lib:

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▒=▒ 

我认为这是由于错误地投射我的角色造成的。当我在一个文件中测试它时,分配给dlsym的char工作正常。

生成文件:

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

1 个答案:

答案 0 :(得分:0)

正如cremno所说,你没有调用这个函数。

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

是一种更易读的方式。