diff options
| -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); +} | 
