2015-03-15 2 views
1

Я пишет свой собственный LIB:Как напечатать переменную 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 a. Когда я тестировал его в одном файле, 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 
+0

Вы не вызываете функцию. Передайте результат 'dlsym()' указателю на функцию, а затем вызовите его. – cremno

+0

'char (* ptr_fun)()' '* (void **) (& ptr_fun) = dlsym (lib," s ")' 'printf (" test:% s ", (* ptr_fun))' @ cremno Если вы имеете в виду это, это решение снова дает мне UH▒▒H▒ = ▒ – adm

+1

Вы все еще не вызываете функцию. 'a = ((char * (*) (void)) dlsym (lib," s "))();' может быть правильным. Здесь '()' называют это. – cremno

ответ

0

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

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

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

Смежные вопросы