Outils pour utilisateurs

Outils du site


gcc_lib_dynamque

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
gcc_lib_dynamque [2007/03/27 23:15] thierrygcc_lib_dynamque [2007/03/28 13:37] (Version actuelle) – I don't like colored code thierry
Ligne 4: Ligne 4:
 == Creer une librairie simple: == == Creer une librairie simple: ==
  
-  #include <unistd.h> +<code> 
-  #include <stdio.h> +#include <unistd.h> 
-  #include <stdlib.h> +#include <stdio.h> 
-    +#include <stdlib.h> 
-  static int lib_load = 0; + 
-    +static int lib_load = 0; 
-  unsigned int my_inc( unsigned int *value ) + 
-  +unsigned int my_inc( unsigned int *value ) 
-     if ( value ) +
-     +   if ( value ) 
-         (*value)++; +   
-         return( (*value) ); +       (*value)++; 
-     +       return( (*value) ); 
-    +   } 
-     return( 0 ); + 
-  +   return( 0 ); 
-    +
-  int my_stat( void ) + 
-  +int my_stat( void ) 
-     return( lib_load ); +
-  +   return( lib_load ); 
-    +
-  void __attribute__ ((constructor)) onload( void ) + 
-  +void __attribute__ ((constructor)) onload( void ) 
-     lib_load++; +
-  +   lib_load++; 
-    +
-  void __attribute__ ((destructor)) onunload( void ) + 
-  +void __attribute__ ((destructor)) onunload( void ) 
-     lib_load--; +
-  }+   lib_load--; 
 +} 
 +</code>
  
 Pour compiler: Pour compiler:
Ligne 43: Ligne 45:
 ''onload'' et ''onunload'' sont juste la pour montrer la possibilite d'executer du code au chargement et déchargement de la lib (mais il paraît que ce n'est pas 'portable')\\ ''onload'' et ''onunload'' sont juste la pour montrer la possibilite d'executer du code au chargement et déchargement de la lib (mais il paraît que ce n'est pas 'portable')\\
  
-suivre...+== Démonstration du chargement == 
 +<code> 
 +#include <stdio.h> 
 +#include <dlfcn.h> 
 +#include <stdlib.h> 
 + 
 +int main( int argc, char *argv[] ) 
 +
 +   void *hlib; 
 +   int ( *my_stat )( void ); 
 +   unsigned int (*my_inc)( unsigned int * ); 
 + 
 +   if ( ! ( hlib=dlopen("./mylibtest.so", RTLD_LAZY ) ) ) 
 +   { 
 +      printf("error: %s\n",dlerror()); 
 +      return EXIT_FAILURE; 
 +   } 
 + 
 +   if ( ! (my_stat = ((int(*)(void))dlsym(hlib,"my_stat")) ) ) 
 +   { 
 + printf("error: %s\n",dlerror()); 
 + return EXIT_FAILURE; 
 +   } 
 + 
 +   printf("my stat= %d\n",my_stat()); 
 + 
 +   if ( ! (my_inc = ((unsigned int(*)(unsigned int *))dlsym(hlib,"my_inc")) ) ) 
 +   { 
 + printf("error: %s\n",dlerror()); 
 + return EXIT_FAILURE; 
 +   } 
 + 
 +   unsigned int v = 500; 
 +   printf("v= %u\n",my_inc(&v)); 
 + 
 +   dlclose( hlib ); 
 + 
 +   return( EXIT_SUCCESS ); 
 +
 +</code> 
 + 
 +Compiler: 
 +  $ gcc -g -Wall -o mytest mytest.c -ldl 
 + 
 +l'execution: 
 +  $ ./mytest 
 +  my stat= 1 
 +  v= 501 
 + 
 +Et voila pour les premiers tests... 
gcc_lib_dynamque.1175037343.txt.gz · Dernière modification : 2007/03/27 23:15 de thierry