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 类型错误造成的。当我在一个文件中对其进行测试时,分配给 dlsym 的字符可以正常工作。

生成文件:

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 回答