| lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 1 | #include <dlfcn.h> | 
|  | 2 | #include <elf.h> | 
|  | 3 | #include <errno.h> | 
|  | 4 | #include <error.h> | 
|  | 5 | #include <link.h> | 
|  | 6 | #include <stdio.h> | 
|  | 7 | #include <stdlib.h> | 
|  | 8 |  | 
|  | 9 | #define MAPS ((struct link_map *) _r_debug.r_map) | 
|  | 10 |  | 
|  | 11 | #define OUT \ | 
|  | 12 | for (map = MAPS; map != NULL; map = map->l_next)			      \ | 
|  | 13 | if (map->l_type == lt_loaded)					      \ | 
|  | 14 | printf ("name = \"%s\", direct_opencount = %d\n",			      \ | 
|  | 15 | map->l_name, (int) map->l_direct_opencount);		      \ | 
|  | 16 | fflush (stdout) | 
|  | 17 |  | 
|  | 18 | int | 
|  | 19 | main (void) | 
|  | 20 | { | 
|  | 21 | void *h[3]; | 
|  | 22 | struct link_map *map; | 
|  | 23 | void (*fp) (void); | 
|  | 24 |  | 
|  | 25 | h[0] = dlopen ("unload2mod.so", RTLD_LAZY); | 
|  | 26 | h[1] = dlopen ("unload2mod.so", RTLD_LAZY); | 
|  | 27 | if (h[0] == NULL || h[1] == NULL) | 
|  | 28 | error (EXIT_FAILURE, errno, "cannot load \"unload2mod.so\""); | 
|  | 29 | h[2] = dlopen ("unload2dep.so", RTLD_LAZY); | 
|  | 30 | if (h[2] == NULL) | 
|  | 31 | error (EXIT_FAILURE, errno, "cannot load \"unload2dep.so\""); | 
|  | 32 |  | 
|  | 33 | puts ("\nAfter loading everything:"); | 
|  | 34 | OUT; | 
|  | 35 |  | 
|  | 36 | dlclose (h[0]); | 
|  | 37 |  | 
|  | 38 | puts ("\nAfter unloading \"unload2mod.so\" once:"); | 
|  | 39 | OUT; | 
|  | 40 |  | 
|  | 41 | dlclose (h[1]); | 
|  | 42 |  | 
|  | 43 | puts ("\nAfter unloading \"unload2mod.so\" twice:"); | 
|  | 44 | OUT; | 
|  | 45 |  | 
|  | 46 | fp = dlsym (h[2], "foo"); | 
|  | 47 | puts ("\nnow calling `foo'"); | 
|  | 48 | fflush (stdout); | 
|  | 49 | fp (); | 
|  | 50 | puts ("managed to call `foo'"); | 
|  | 51 | fflush (stdout); | 
|  | 52 |  | 
|  | 53 | dlclose (h[2]); | 
|  | 54 |  | 
|  | 55 | puts ("\nAfter unloading \"unload2dep.so\":"); | 
|  | 56 | OUT; | 
|  | 57 |  | 
|  | 58 | return 0; | 
|  | 59 | } |