about summary refs log tree commit diff
path: root/REORG.TODO/elf/loadfail.c
diff options
context:
space:
mode:
Diffstat (limited to 'REORG.TODO/elf/loadfail.c')
-rw-r--r--REORG.TODO/elf/loadfail.c42
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;
+}