Test library load/unload events
[lttng-tools.git] / tests / regression / ust / ust-dl / prog.c
index 015eee6269830e8e6e2150c7d9dbf592bfd66e96..e8e4b2641a1c6a0437c0e94ca6933eda741e30fc 100644 (file)
@@ -1,16 +1,72 @@
+/* _GNU_SOURCE is defined by config.h */
 #include <dlfcn.h>
+#include <stdio.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
 
-int main()
+/*
+ * libfoo has a direct dependency on libbar.
+ * libbar has a direct dependency on libzzz.
+ * This test is therefore a mix of dlopen/dlclose and dlmopen/dlclose of
+ * libfoo, and of its direct dependencies.
+ */
+int main(int argc, char **argv)
 {
-       void *handle;
-       int (*foo)();
+       void *h0, *h1, *h2, *h3, *h4;
+       char *error;
+       int (*foo)(void);
 
-       handle = dlopen("libfoo.so", RTLD_LAZY);
-       foo = dlsym(handle, "foo");
+       h0 = dlopen("libbar.so", RTLD_LAZY);
+       if (!h0) {
+               goto get_error;
+       }
+       h1 = dlmopen(LM_ID_BASE, "libfoo.so", RTLD_LAZY);
+       if (!h1) {
+               goto get_error;
+       }
+       h2 = dlopen("libzzz.so", RTLD_LAZY);
+       if (!h2) {
+               goto get_error;
+       }
+       h3 = dlopen("libfoo.so", RTLD_LAZY);
+       if (!h3) {
+               goto get_error;
+       }
+       h4 = dlopen("libfoo.so", RTLD_LAZY);
+       if (!h4) {
+               goto get_error;
+       }
 
-       (*foo)();
+       foo = dlsym(h1, "foo");
+       error = dlerror();
+       if (error != NULL) {
+               goto error;
+       }
 
-       dlclose(handle);
+       foo();
 
-       return 0;
+       if (dlclose(h0)) {
+               goto get_error;
+       }
+       if (dlclose(h1)) {
+               goto get_error;
+       }
+       if (dlclose(h2)) {
+               goto get_error;
+       }
+       if (dlclose(h3)) {
+               goto get_error;
+       }
+       if (dlclose(h4)) {
+               goto get_error;
+       }
+
+       exit(EXIT_SUCCESS);
+
+get_error:
+       error = dlerror();
+error:
+       fprintf(stderr, "%s\n", error);
+       exit(EXIT_FAILURE);
 }
This page took 0.024723 seconds and 5 git commands to generate.