diff options
Diffstat (limited to 'test/dlopen')
-rw-r--r-- | test/dlopen/.cvsignore | 5 | ||||
-rw-r--r-- | test/dlopen/Makefile | 26 | ||||
-rw-r--r-- | test/dlopen/dltest.c | 45 | ||||
-rw-r--r-- | test/dlopen/libtest.c | 16 |
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 +} + |