diff options
Diffstat (limited to 'REORG.TODO/elf/unload2.c')
-rw-r--r-- | REORG.TODO/elf/unload2.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/REORG.TODO/elf/unload2.c b/REORG.TODO/elf/unload2.c new file mode 100644 index 0000000000..eef2bfd426 --- /dev/null +++ b/REORG.TODO/elf/unload2.c @@ -0,0 +1,59 @@ +#include <dlfcn.h> +#include <elf.h> +#include <errno.h> +#include <error.h> +#include <link.h> +#include <stdio.h> +#include <stdlib.h> + +#define MAPS ((struct link_map *) _r_debug.r_map) + +#define OUT \ + for (map = MAPS; map != NULL; map = map->l_next) \ + if (map->l_type == lt_loaded) \ + printf ("name = \"%s\", direct_opencount = %d\n", \ + map->l_name, (int) map->l_direct_opencount); \ + fflush (stdout) + +int +main (void) +{ + void *h[3]; + struct link_map *map; + void (*fp) (void); + + h[0] = dlopen ("unload2mod.so", RTLD_LAZY); + h[1] = dlopen ("unload2mod.so", RTLD_LAZY); + if (h[0] == NULL || h[1] == NULL) + error (EXIT_FAILURE, errno, "cannot load \"unload2mod.so\""); + h[2] = dlopen ("unload2dep.so", RTLD_LAZY); + if (h[2] == NULL) + error (EXIT_FAILURE, errno, "cannot load \"unload2dep.so\""); + + puts ("\nAfter loading everything:"); + OUT; + + dlclose (h[0]); + + puts ("\nAfter unloading \"unload2mod.so\" once:"); + OUT; + + dlclose (h[1]); + + puts ("\nAfter unloading \"unload2mod.so\" twice:"); + OUT; + + fp = dlsym (h[2], "foo"); + puts ("\nnow calling `foo'"); + fflush (stdout); + fp (); + puts ("managed to call `foo'"); + fflush (stdout); + + dlclose (h[2]); + + puts ("\nAfter unloading \"unload2dep.so\":"); + OUT; + + return 0; +} |