summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/dlopen/Makefile18
-rw-r--r--test/dlopen/dlstatic.c43
-rw-r--r--test/dlopen/libstatic.c15
3 files changed, 68 insertions, 8 deletions
diff --git a/test/dlopen/Makefile b/test/dlopen/Makefile
index 8c6032238..defe764ed 100644
--- a/test/dlopen/Makefile
+++ b/test/dlopen/Makefile
@@ -4,24 +4,26 @@
# rules need a little love to work with glibc ...
export UCLIBC_ONLY := 1
-TESTS := dltest dltest2 test1 test2 test3
+TESTS := dltest dltest2 dlstatic test1 test2 test3
include ../Test.mak
-CFLAGS_dltest := -DLIBNAME="\"./libtest.so\""
-CFLAGS_dltest2 := -DLIBNAME="\"./libtest3.so\""
+CFLAGS_dltest := -DLIBNAME="\"./libtest.so\""
+CFLAGS_dltest2 := -DLIBNAME="\"./libtest3.so\""
-LDFLAGS_dltest := -ldl -lpthread
-LDFLAGS_dltest2 := -ldl -lpthread
-LDFLAGS_test1 := -ldl
-LDFLAGS_test2 := -ldl
-LDFLAGS_test3 := -ldl ./libtest1.so ./libtest2.so -Wl,-rpath,.
+LDFLAGS_dlstatic := -ldl
+LDFLAGS_dltest := -ldl -lpthread
+LDFLAGS_dltest2 := -ldl -lpthread
+LDFLAGS_test1 := -ldl
+LDFLAGS_test2 := -ldl
+LDFLAGS_test3 := -ldl ./libtest1.so ./libtest2.so -Wl,-rpath,.
DEBUG_LIBS := X
WRAPPER := env $(DEBUG_LIBS)=all LD_LIBRARY_PATH="$$PWD:.:$(LD_LIBRARY_PATH)"
dltest: libtest.so
dltest2: libtest3.so
+dlstatic: libstatic.so
test1: libtest1.so
test2: libtest1.so libtest2.so
test3: libtest1.so libtest2.so
diff --git a/test/dlopen/dlstatic.c b/test/dlopen/dlstatic.c
new file mode 100644
index 000000000..57c8c5dd1
--- /dev/null
+++ b/test/dlopen/dlstatic.c
@@ -0,0 +1,43 @@
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <dlfcn.h>
+#include <stdint.h>
+
+#define LIBNAME "libstatic.so"
+
+int load_and_test(void)
+{
+ void *handle;
+ int (*mystatic)(void);
+
+ handle = dlopen(LIBNAME, RTLD_LAZY);
+ if (!handle) {
+ fprintf(stderr, "Could not open ./%s: %s\n", LIBNAME, dlerror());
+ return 1;
+ }
+
+ mystatic = dlsym(handle, "static_test");
+ if (mystatic == NULL) {
+ fprintf(stderr, "Could not locate symbol 'static_test': %s\n", dlerror());
+ return 1;
+ }
+
+ if (!mystatic()) {
+ fprintf(stderr, "mystatic() failed: static vars were not setup properly\n");
+ return 1;
+ }
+
+ dlclose(handle);
+
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ int count = 5;
+ while (count-- > 0)
+ if (load_and_test())
+ return EXIT_FAILURE;
+ return EXIT_SUCCESS;
+}
diff --git a/test/dlopen/libstatic.c b/test/dlopen/libstatic.c
new file mode 100644
index 000000000..bf44c3c68
--- /dev/null
+++ b/test/dlopen/libstatic.c
@@ -0,0 +1,15 @@
+#include <stdio.h>
+
+static int global_static = -1;
+
+int static_test(void)
+{
+ static int local_static = -2;
+
+ if (global_static != -1)
+ printf("FAIL: global_static is not -1\n");
+ if (local_static != -2)
+ printf("FAIL: local_static is not -2\n");
+
+ return (global_static == -1 && local_static == -2);
+}