1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <dlfcn.h> 4 #include <fstest.h> 5 6 void 7 usage (char *name) 8 { 9 printf ("%s path\n", name); 10 exit (EXIT_FAILURE); 11 } 12 13 int 14 main (int argc, char *argv[]) 15 { 16 fstest_t buf; 17 void *fstest_handle; 18 fs_test_f fs_test; 19 20 if (argc <= 1) 21 usage (argv[0]); 22 23 if (!(fstest_handle = dlopen ("libfstest.so", RTLD_LAZY))) 24 { 25 printf ("An error occured: %s\n", dlerror ()); 26 exit (EXIT_FAILURE); 27 } 28 29 if (!(fs_test = dlsym (fstest_handle, "fs_test"))) 30 { 31 printf ("An error occured: %s\n", dlerror ()); 32 dlclose (fstest_handle); 33 exit (EXIT_FAILURE); 34 } 35 36 if (fs_test (argv[1], &buf) >= 0) 37 { 38 printf ("%s\t%ld/%ld %d%%\n", argv[1], buf.free, buf.total, 39 buf.percent_free); 40 } 41 else 42 { 43 printf ("An error occured\n"); 44 } 45 dlclose (fstest_handle); 46 exit (EXIT_SUCCESS); 47 }
Vous avez-là le même programme que celui qui servait d'exemple dans l'article précédent. Seulement, si vous le compilez, vous n'avez pas besoin de le lier à libfstest.so
. Pour compiler ce fichier, qui s'appelle test.c
, et en supposant que la bibliothèque partagée est dans /tmp/fstest (seul le fichier d'en-tête et son chemin nous intéresse), faites ceci:
$ gcc -I/tmp/fstest/include -Wall test.c -ldl -o test_dlopen
Vous devez obtenir un binaire nommé test_dlopen
. Avant de l'exécuter, faites ldd test_dlopen
. Chez moi, cela renvoie:
$ ldd test_dlopen libdl.so.2 => /lib/libdl.so.2 (0x4001e000) libc.so.6 => /lib/i686/libc.so.6 (0x40021000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Vous voyez donc que le binaire n'est pas lié à libfstest.so
et n'a rien à voir avec.
Lancez le binaire, avec comme argument un chemin, et vous obtiendrez l'occupation de la partition concernée, comme c'était déjà le cas dans l'article précédent. Si cela ne marche pas, vérifiez que /tmp/fstest/lib est bien dans les chemins de chargement des bibliothèques partagées, c'est-à-dire dans /etc/ld.so.conf ou dans la variable d'environnement $LD_LIBRARY_PATH
. Si cela marche, vous avez chargé le greffon avec succès et vous l'avez utilisé comme si le chargeur était lié au greffon alors que ce n'est pas le cas.
© 2002 Yves Mettier