Как напечатать переменную dlsym()?

Я пишу свою собственную библиотеку:

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, назначенный для dlsym, работает нормально.

Makefile:

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

1 ответ

Как было упомянуто, вы не вызывали функцию.

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

было бы несколько более читабельным способом сделать это.

Другие вопросы по тегам