summaryrefslogtreecommitdiff
path: root/tests/libexec
diff options
context:
space:
mode:
authorjoerg <joerg@NetBSD.org>2011-03-31 23:34:47 +0000
committerjoerg <joerg@NetBSD.org>2011-03-31 23:34:47 +0000
commitc0faba35b87efddabef79c588b0f19b4fc75557c (patch)
tree57d726735e60ecf7b006460fdea51597500a1cad /tests/libexec
parentfa9c652eb0c8af1615070dd33cb2f4dd35d04d8a (diff)
Add initial regression test for ld.elf_so locking.
Diffstat (limited to 'tests/libexec')
-rw-r--r--tests/libexec/ld.elf_so/Makefile6
-rw-r--r--tests/libexec/ld.elf_so/h_locking.c149
-rw-r--r--tests/libexec/ld.elf_so/helper_dso1/Makefile19
-rw-r--r--tests/libexec/ld.elf_so/helper_dso1/h_helper_dso1.c65
-rw-r--r--tests/libexec/ld.elf_so/helper_dso2/Makefile22
-rw-r--r--tests/libexec/ld.elf_so/helper_dso2/h_helper_dso2.c57
6 files changed, 318 insertions, 0 deletions
diff --git a/tests/libexec/ld.elf_so/Makefile b/tests/libexec/ld.elf_so/Makefile
index 4410569aa9c..235e759fc39 100644
--- a/tests/libexec/ld.elf_so/Makefile
+++ b/tests/libexec/ld.elf_so/Makefile
@@ -5,6 +5,8 @@ NOMAN= # defined
.include <bsd.own.mk>
+SUBDIR+= helper_dso1 .WAIT helper_dso2
+
TESTSDIR= ${TESTSBASE}/libexec/ld.elf_so
TESTS_C+= t_dlerror-cleared t_dlerror-false t_dlinfo
@@ -21,4 +23,8 @@ PROGS+= h_df_1_noopen2
SRCS.h_df_1_noopen2= h_df_1_noopen.c
LDADD.h_df_1_noopen2= -lpthread
+PROGS+= h_locking
+SRCS.h_locking= h_locking.c
+LDADD.h_locking= -lpthread -Wl,--export-dynamic -Wl,-rpath,${TESTSDIR}
+
.include <bsd.test.mk>
diff --git a/tests/libexec/ld.elf_so/h_locking.c b/tests/libexec/ld.elf_so/h_locking.c
new file mode 100644
index 00000000000..4ff3fc4f076
--- /dev/null
+++ b/tests/libexec/ld.elf_so/h_locking.c
@@ -0,0 +1,149 @@
+/*-
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Joerg Sonnenberger.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <dlfcn.h>
+#include <link_elf.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+int sleep_init;
+int sleep_fini;
+int dlopen_cookie;
+int dlclose_cookie;
+
+void (*tls_callback_sym)(void);
+
+static int
+dl_iterate_phdr_cb(struct dl_phdr_info *info, size_t size, void *data)
+{
+ (*tls_callback_sym)();
+ return 0;
+}
+
+static void *
+test_dl_iterate_phdr_helper(void *dummy)
+{
+ sleep(10);
+ _exit(1);
+}
+
+static void
+test_dl_iterate_phdr(void)
+{
+ pthread_t t;
+ void *dso;
+ sleep_init = 0;
+ sleep_fini = 0;
+ if ((dso = dlopen("libh_helper_dso2.so", RTLD_LAZY)) == NULL) {
+ fprintf(stderr, "opening helper failed\n");
+ _exit(1);
+ }
+ tls_callback_sym = dlsym(dso, "tls_callback");
+ if (tls_callback_sym == NULL) {
+ fprintf(stderr, "bad helper\n");
+ _exit(1);
+ }
+ pthread_create(&t, NULL, test_dl_iterate_phdr_helper, NULL);
+ if (dl_iterate_phdr(dl_iterate_phdr_cb, NULL))
+ _exit(1);
+ _exit(0);
+}
+
+static void *
+init_fini_helper(void *arg)
+{
+ void *dso;
+ if ((dso = dlopen(arg, RTLD_LAZY)) == NULL) {
+ fprintf(stderr, "opening %s failed\n", (char *)arg);
+ exit(1);
+ }
+ dlclose(dso);
+ return NULL;
+}
+
+static void
+test_dlopen(void)
+{
+ pthread_t t1, t2;
+ sleep_init = 1;
+ sleep_fini = 0;
+ printf("%d\n", dlopen_cookie);
+ pthread_create(&t1, NULL, init_fini_helper,
+ __UNCONST("libh_helper_dso2.so"));
+ sleep(1);
+ printf("%d\n", dlopen_cookie);
+ if (dlopen_cookie != 1)
+ _exit(1);
+ sleep(1);
+ pthread_create(&t2, NULL, init_fini_helper,
+ __UNCONST("libutil.so"));
+ printf("%d\n", dlopen_cookie);
+ if (dlopen_cookie != 1)
+ _exit(1);
+ _exit(0);
+}
+
+static void
+test_dlclose(void)
+{
+ pthread_t t1, t2;
+ sleep_init = 0;
+ sleep_fini = 1;
+ printf("%d\n", dlclose_cookie);
+ pthread_create(&t1, NULL, init_fini_helper,
+ __UNCONST("libh_helper_dso2.so"));
+ sleep(1);
+ printf("%d\n", dlclose_cookie);
+ if (dlclose_cookie != 2)
+ _exit(1);
+ pthread_create(&t2, NULL, init_fini_helper,
+ __UNCONST("libutil.so"));
+ sleep(1);
+ printf("%d\n", dlclose_cookie);
+ if (dlclose_cookie != 2)
+ _exit(1);
+ _exit(0);
+}
+
+int
+main(int argc, char **argv)
+{
+ if (argc != 2)
+ return 1;
+ if (strcmp(argv[1], "dl_iterate_phdr") == 0)
+ test_dl_iterate_phdr();
+ if (strcmp(argv[1], "dlopen") == 0)
+ test_dlopen();
+ if (strcmp(argv[1], "dlclose") == 0)
+ test_dlclose();
+ return 1;
+}
diff --git a/tests/libexec/ld.elf_so/helper_dso1/Makefile b/tests/libexec/ld.elf_so/helper_dso1/Makefile
new file mode 100644
index 00000000000..b7c14073eea
--- /dev/null
+++ b/tests/libexec/ld.elf_so/helper_dso1/Makefile
@@ -0,0 +1,19 @@
+# $NetBSD: Makefile,v 1.1 2011/03/31 23:34:48 joerg Exp $
+
+.include <bsd.own.mk>
+
+LIB= h_helper_dso1
+SRCS= h_helper_dso1.c
+
+LIBDIR= ${TESTSBASE}/libexec/ld.elf_so
+SHLIBDIR= ${TESTSBASE}/libexec/ld.elf_so
+SHLIB_MAJOR= 1
+
+MKSTATICLIB= no
+MKPROFILE= no
+MKPICINSTALL= no
+MKLINT= no
+
+NOMAN= # defined
+
+.include <bsd.lib.mk>
diff --git a/tests/libexec/ld.elf_so/helper_dso1/h_helper_dso1.c b/tests/libexec/ld.elf_so/helper_dso1/h_helper_dso1.c
new file mode 100644
index 00000000000..8b8b5a16fe4
--- /dev/null
+++ b/tests/libexec/ld.elf_so/helper_dso1/h_helper_dso1.c
@@ -0,0 +1,65 @@
+/*-
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Joerg Sonnenberger.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <poll.h>
+#include <stddef.h>
+
+extern int sleep_init;
+extern int sleep_fini;
+extern int dlopen_cookie;
+
+void __attribute__((__constructor__))
+init1(void)
+{
+ dlopen_cookie = 1;
+ if (!sleep_init)
+ return;
+ for (;;)
+ poll(NULL, 0, -1);
+}
+
+extern int dlclose_cookie;
+
+void __attribute__((__destructor__))
+fini1(void)
+{
+ dlclose_cookie = 1;
+ if (!sleep_fini)
+ return;
+ for (;;)
+ poll(NULL, 0, -1);
+}
+
+static __thread int tls_callback_var;
+
+void
+tls_callback(void)
+{
+ tls_callback_var = 1;
+}
diff --git a/tests/libexec/ld.elf_so/helper_dso2/Makefile b/tests/libexec/ld.elf_so/helper_dso2/Makefile
new file mode 100644
index 00000000000..a7b7bc359be
--- /dev/null
+++ b/tests/libexec/ld.elf_so/helper_dso2/Makefile
@@ -0,0 +1,22 @@
+# $NetBSD: Makefile,v 1.1 2011/03/31 23:34:48 joerg Exp $
+
+.include <bsd.own.mk>
+
+LIB= h_helper_dso2
+SRCS= h_helper_dso2.c
+
+DSO1DIR!= cd ${.CURDIR}/../helper_dso1 && ${PRINTOBJDIR}
+LDADD+= -Wl,-rpath,${TESTSDIR} -L${DSO1DIR} -lh_helper_dso1
+
+LIBDIR= ${TESTSBASE}/libexec/ld.elf_so
+SHLIBDIR= ${TESTSBASE}/libexec/ld.elf_so
+SHLIB_MAJOR= 1
+
+MKSTATICLIB= no
+MKPROFILE= no
+MKPICINSTALL= no
+MKLINT= no
+
+NOMAN= # defined
+
+.include <bsd.lib.mk>
diff --git a/tests/libexec/ld.elf_so/helper_dso2/h_helper_dso2.c b/tests/libexec/ld.elf_so/helper_dso2/h_helper_dso2.c
new file mode 100644
index 00000000000..cd142185b41
--- /dev/null
+++ b/tests/libexec/ld.elf_so/helper_dso2/h_helper_dso2.c
@@ -0,0 +1,57 @@
+/*-
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Joerg Sonnenberger.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <poll.h>
+#include <stddef.h>
+
+extern int sleep_init;
+extern int sleep_fini;
+extern int dlopen_cookie;
+
+void __attribute__((__constructor__))
+init2(void)
+{
+ dlopen_cookie = 2;
+ if (!sleep_init)
+ return;
+ for (;;)
+ poll(NULL, 0, -1);
+}
+
+extern int dlclose_cookie;
+
+void __attribute__((__destructor__))
+fini2(void)
+{
+ dlclose_cookie = 2;
+ if (!sleep_fini)
+ return;
+ for (;;)
+ poll(NULL, 0, -1);
+}