diff options
Diffstat (limited to 'REORG.TODO/elf/loadfail.c')
-rw-r--r-- | REORG.TODO/elf/loadfail.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/REORG.TODO/elf/loadfail.c b/REORG.TODO/elf/loadfail.c new file mode 100644 index 0000000000..7531aa958e --- /dev/null +++ b/REORG.TODO/elf/loadfail.c @@ -0,0 +1,42 @@ +#include <dlfcn.h> +#include <error.h> +#include <mcheck.h> +#include <stdio.h> +#include <stdlib.h> + +int +main (void) +{ + void *su[5]; + void *h; + int n; + + mtrace (); + + if ((su[0] = dlopen ("testobj1.so", RTLD_GLOBAL | RTLD_NOW)) == NULL + || (su[1] = dlopen ("testobj2.so", RTLD_GLOBAL | RTLD_NOW)) == NULL + || (su[2] = dlopen ("testobj3.so", RTLD_GLOBAL | RTLD_NOW)) == NULL + || (su[3] = dlopen ("testobj4.so", RTLD_GLOBAL | RTLD_NOW)) == NULL + || (su[4] = dlopen ("testobj5.so", RTLD_GLOBAL | RTLD_NOW)) == NULL) + error (EXIT_FAILURE, 0, "failed to load shared object: %s", dlerror ()); + + h = dlopen ("failobj.so", RTLD_GLOBAL | RTLD_NOW); + + printf ("h = %p, %s\n", h, h == NULL ? "ok" : "fail"); + + for (n = 0; n < 5; ++n) + if (dlclose (su[n]) != 0) + { + printf ("failed to unload su[%d]: %s\n", n, dlerror ()); + exit (EXIT_FAILURE); + } + + return h != NULL; +} + +extern int foo (int a); +int +foo (int a) +{ + return 10; +} |