Browse Source

make sure static variables are re-initialized everytime

Mike Frysinger 17 years ago
parent
commit
9da4b6afff
3 changed files with 68 additions and 8 deletions
  1. 10 8
      test/dlopen/Makefile
  2. 43 0
      test/dlopen/dlstatic.c
  3. 15 0
      test/dlopen/libstatic.c

+ 10 - 8
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

+ 43 - 0
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;
+}

+ 15 - 0
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);
+}