summaryrefslogtreecommitdiff
path: root/test/dlopen
diff options
context:
space:
mode:
Diffstat (limited to 'test/dlopen')
-rw-r--r--test/dlopen/.cvsignore5
-rw-r--r--test/dlopen/Makefile26
-rw-r--r--test/dlopen/dltest.c45
-rw-r--r--test/dlopen/libtest.c16
4 files changed, 89 insertions, 3 deletions
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
+}
+