From fec8e9db57394a77a9f757aab4c342baa098a1aa Mon Sep 17 00:00:00 2001
From: Eric Andersen <andersen@codepoet.org>
Date: Mon, 1 Sep 2003 23:43:42 +0000
Subject: move the ldso tests to dlopen where they belong

---
 test/dlopen/.cvsignore |  5 +++++
 test/dlopen/Makefile   | 26 +++++++++++++++++++++++---
 test/dlopen/dltest.c   | 45 +++++++++++++++++++++++++++++++++++++++++++++
 test/dlopen/libtest.c  | 16 ++++++++++++++++
 4 files changed, 89 insertions(+), 3 deletions(-)
 create mode 100644 test/dlopen/dltest.c
 create mode 100644 test/dlopen/libtest.c

(limited to 'test/dlopen')

diff --git a/test/dlopen/.cvsignore b/test/dlopen/.cvsignore
index 373baecfa..406a0ac40 100644
--- a/test/dlopen/.cvsignore
+++ b/test/dlopen/.cvsignore
@@ -6,3 +6,8 @@ dlttest2
 test1
 test2
 test3
+dltest
+dltest2
+libtest.so
+libtest3.so
+.gdbinit
diff --git a/test/dlopen/Makefile b/test/dlopen/Makefile
index cd8af9095..8ac46503e 100644
--- a/test/dlopen/Makefile
+++ b/test/dlopen/Makefile
@@ -1,6 +1,6 @@
 # Makefile for uClibc
 #
-# Copyright (C) 2000,2001 Erik Andersen <andersen@uclibc.org>
+# Copyright (C) 2000-2003 Erik Andersen <andersen@uclibc.org>
 #
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of the GNU Library General Public License as published by the Free
@@ -15,6 +15,7 @@
 # You should have received a copy of the GNU Library General Public License
 # along with this program; if not, write to the Free Software Foundation, Inc.,
 # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+# Makefile for uClibc
 
 TESTDIR=../
 include $(TESTDIR)/Rules.mak
@@ -42,13 +43,32 @@ libtest1.so: libtest1.o
 libtest2.so: libtest2.o
 	$(CC) $(CFLAGS) -fPIC -shared -o libtest2.so -Wl,-soname,libtest2.so libtest2.o
 
-run: libtest2.so libtest1.so test1 test2 test3
+dltest: dltest.c
+	$(CC) $(CFLAGS) -DLIBNAME="\"./libtest.so\"" dltest.c -ldl -lpthread -o dltest
+
+libtest.so: libtest.c
+	$(CC) $(CFLAGS) -fPIC -shared -Wl,-soname,libtest.so libtest.c -o libtest.so
+
+# Second time, directly link libtest3.so with libpthread
+dltest2: dltest.c
+	$(CC) $(CFLAGS) -DLIBNAME="\"./libtest3.so\"" dltest.c -ldl -lpthread -o dltest2
+
+libtest3.so: libtest.c
+	$(CC) $(CFLAGS) -fPIC -shared -Wl,-soname,libtest3.so libtest.c -o libtest3.so -lpthread
+
+run: libtest2.so libtest1.so test1 test2 test3 dltest libtest.so dltest2 libtest3.so
 	@echo "----------running test 1--------------"
 	-LD_LIBRARY_PATH=`pwd`:. LD_DEBUG=all ./test1
 	@echo "----------running test 2--------------"
 	-LD_LIBRARY_PATH=`pwd`:. LD_DEBUG=all ./test2
 	@echo "----------running test 3--------------"
 	-LD_LIBRARY_PATH=`pwd`:. LD_DEBUG=all ./test3
+	@echo "----------running test 3--------------"
+	-LD_DEBUG=all ./dltest2
+	@echo "----------running test 4--------------"
+	-LD_DEBUG=all ./dltest
 
 clean:
-	rm -f *.o libtest1.so* libtest2.so* test1 test2 test3
+	rm -f *.o libtest1.so* libtest2.so* test1 test2 test3 \
+		dltest dltest2 libtest.so libtest3.so
+
diff --git a/test/dlopen/dltest.c b/test/dlopen/dltest.c
new file mode 100644
index 000000000..244f3b76b
--- /dev/null
+++ b/test/dlopen/dltest.c
@@ -0,0 +1,45 @@
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <dlfcn.h>
+#include <stdint.h>
+
+#ifdef __UCLIBC__
+extern void _dlinfo(void);
+#endif
+
+int main(int argc, char **argv) 
+{
+	int ret = EXIT_SUCCESS;
+	void *handle;
+	void (*mydltest)(void *value1, void *value2);
+	char *error;
+	uint32_t *value1, *value2;
+
+	handle = dlopen (LIBNAME, RTLD_LAZY);
+	if (!handle) {
+		fprintf(stderr, "Could not open ./libtest.so: %s\n", dlerror());
+		exit(1);
+	}
+
+	mydltest = dlsym(handle, "dltest");
+	if ((error = dlerror()) != NULL)  {
+		fprintf(stderr, "Could not locate symbol 'dltest': %s\n", error);
+		exit(1);
+	}
+
+	mydltest(&value1, &value2);
+	printf("dltest: __pthread_return_0=%p\n", value1);
+	printf("dltest: pthread_self=%p\n", value2);
+	if (value1 == value2) {
+	    ret = EXIT_FAILURE;
+	    printf("dltest: values should NOT be equal  Weak values resolved incorrectly!\n");
+	} else {
+	    printf("dltest: weak symbols resoved correctly.\n");
+	}
+
+	dlclose(handle);
+
+	return ret;
+}
+
diff --git a/test/dlopen/libtest.c b/test/dlopen/libtest.c
new file mode 100644
index 000000000..cdb37403d
--- /dev/null
+++ b/test/dlopen/libtest.c
@@ -0,0 +1,16 @@
+#include <stdio.h>
+#include <pthread.h>
+#include <stdint.h>
+
+extern int __pthread_return_0(void);
+
+void dltest(uint32_t **value1, uint32_t **value2)
+{
+	*value1 = (uint32_t *) __pthread_return_0;
+	*value2 = (uint32_t *) pthread_self;
+#if 0
+	printf("dltest: __pthread_return_0=%p\n", __pthread_return_0);
+	printf("dltest: pthread_self=%p\n", pthread_self);
+#endif
+}
+
-- 
cgit v1.2.3