add regress test for RTLD_NODELETE support
authorsemarie <semarie@openbsd.org>
Wed, 2 Jun 2021 07:32:34 +0000 (07:32 +0000)
committersemarie <semarie@openbsd.org>
Wed, 2 Jun 2021 07:32:34 +0000 (07:32 +0000)
regress/libexec/ld.so/Makefile
regress/libexec/ld.so/nodelete/Makefile [new file with mode: 0644]
regress/libexec/ld.so/nodelete/liba/Makefile [new file with mode: 0644]
regress/libexec/ld.so/nodelete/liba/liba.c [new file with mode: 0644]
regress/libexec/ld.so/nodelete/liba/shlib_version [new file with mode: 0644]
regress/libexec/ld.so/nodelete/test1/Makefile [new file with mode: 0644]
regress/libexec/ld.so/nodelete/test1/test1.c [new file with mode: 0644]

index dc5bb9a..1b169b5 100644 (file)
@@ -1,10 +1,10 @@
-#      $OpenBSD: Makefile,v 1.17 2016/09/27 06:52:50 kettenis Exp $
+#      $OpenBSD: Makefile,v 1.18 2021/06/02 07:32:34 semarie Exp $
 
 SUBDIR+= elf hidden weak dlsym dlopen dlclose lazy
 SUBDIR+= constructor 
 SUBDIR+= link-order edgecases initfirst
 SUBDIR+= df_1_noopen randomdata subst dependencies
-SUBDIR+= init-env
+SUBDIR+= init-env nodelete
 
 install:
 
diff --git a/regress/libexec/ld.so/nodelete/Makefile b/regress/libexec/ld.so/nodelete/Makefile
new file mode 100644 (file)
index 0000000..844d347
--- /dev/null
@@ -0,0 +1,5 @@
+# $OpenBSD: Makefile,v 1.1 2021/06/02 07:32:34 semarie Exp $
+
+SUBDIR +=      liba test1
+
+.include <bsd.subdir.mk>
diff --git a/regress/libexec/ld.so/nodelete/liba/Makefile b/regress/libexec/ld.so/nodelete/liba/Makefile
new file mode 100644 (file)
index 0000000..ae82bfa
--- /dev/null
@@ -0,0 +1,7 @@
+#      $OpenBSD: Makefile,v 1.1 2021/06/02 07:32:34 semarie Exp $
+
+LIB =  a
+SRCS = liba.c
+
+.include <bsd.lib.mk>
+
diff --git a/regress/libexec/ld.so/nodelete/liba/liba.c b/regress/libexec/ld.so/nodelete/liba/liba.c
new file mode 100644 (file)
index 0000000..cf3eb35
--- /dev/null
@@ -0,0 +1,4 @@
+void
+function(void)
+{
+}
diff --git a/regress/libexec/ld.so/nodelete/liba/shlib_version b/regress/libexec/ld.so/nodelete/liba/shlib_version
new file mode 100644 (file)
index 0000000..97c9f92
--- /dev/null
@@ -0,0 +1,2 @@
+major=0
+minor=0
diff --git a/regress/libexec/ld.so/nodelete/test1/Makefile b/regress/libexec/ld.so/nodelete/test1/Makefile
new file mode 100644 (file)
index 0000000..ed6efd7
--- /dev/null
@@ -0,0 +1,13 @@
+#      $OpenBSD: Makefile,v 1.1 2021/06/02 07:32:34 semarie Exp $
+
+PROG = test1
+
+ADIR !=        if test -d ${.CURDIR}/../liba/${__objdir}; then \
+               echo "${.CURDIR}/../liba/${__objdir}";  \
+       else                                            \
+               echo "${.CURDIR}/../liba";              \
+       fi
+
+CFLAGS +=      -DLIBNAME=\"${ADIR}/liba.so.0.0\"
+
+.include <bsd.regress.mk>
diff --git a/regress/libexec/ld.so/nodelete/test1/test1.c b/regress/libexec/ld.so/nodelete/test1/test1.c
new file mode 100644 (file)
index 0000000..75dd8a5
--- /dev/null
@@ -0,0 +1,60 @@
+
+#include <err.h>
+#include <dlfcn.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifndef LIBNAME
+#error "LIBNAME undefined"
+#endif
+
+#ifndef SYMBOL
+#define SYMBOL "function"
+#endif
+
+int
+checksym(const char *name)
+{
+       void *sym = dlsym(RTLD_DEFAULT, name);
+       
+       if (sym != NULL) {
+               printf("symbol present: %s\n", name);
+               return 1;
+       } else {
+               printf("symbol absent: %s\n", name);
+               return 0;
+       }
+}
+
+int
+main(int argc, char *argv[])
+{
+       void *h1;
+       void *h2;
+
+       /* symbol should not be here at startup */
+       if (checksym(SYMBOL) == 1)
+               errx(1, "symbol found: %s", SYMBOL);
+       
+       printf("opening\n");
+       if ((h1 = dlopen(LIBNAME, RTLD_GLOBAL)) == NULL)
+               errx(1, "dlopen: h1: %s: %s", LIBNAME, dlerror());
+       if ((h2 = dlopen(LIBNAME, RTLD_GLOBAL|RTLD_NODELETE)) == NULL)
+               errx(1, "dlopen: h2: %s: %s", LIBNAME, dlerror());
+
+       /* symbol should be here after loading */
+       if (checksym(SYMBOL) == 0)
+               errx(1, "symbol not found: %s", SYMBOL);
+
+       printf("closing\n");
+       if (dlclose(h2) != 0)
+               errx(1, "dlclose: h2: %s", dlerror());
+       if (dlclose(h1) != 0)
+               errx(1, "dlclose: h1: %s", dlerror());
+
+       /* symbol should be still here, as one dlopen(3) had RTLD_NODELETE */
+       if (checksym(SYMBOL) == 0)
+               errx(1, "symbol not found: %s", SYMBOL);
+
+       return 0;
+}