diff options
Diffstat (limited to 'test/dlopen')
-rw-r--r-- | test/dlopen/Makefile | 18 | ||||
-rw-r--r-- | test/dlopen/dlstatic.c | 43 | ||||
-rw-r--r-- | test/dlopen/libstatic.c | 15 |
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); +} |