about summary refs log tree commit diff
path: root/elf
diff options
context:
space:
mode:
authorStan Shebs <stanshebs@google.com>2018-03-29 11:48:37 -0700
committerStan Shebs <stanshebs@google.com>2018-03-29 11:48:37 -0700
commitd57236debc46317a95c1741702252f4e44b90070 (patch)
treef2e5d1f57fff017c53403b8a50034e5538c1c97d /elf
parent641cae4c36e4d34ebc14690f5db05b3330be46f5 (diff)
downloadglibc-d57236debc46317a95c1741702252f4e44b90070.tar.gz
glibc-d57236debc46317a95c1741702252f4e44b90070.tar.xz
glibc-d57236debc46317a95c1741702252f4e44b90070.zip
Add basic testsuite for dlopen_with_offset
Diffstat (limited to 'elf')
-rw-r--r--elf/Makefile9
-rw-r--r--elf/tst-dlopen-offset-mod1.c15
-rw-r--r--elf/tst-dlopen-offset-mod2.c8
-rw-r--r--elf/tst-dlopen-offset-mod3.c8
-rw-r--r--elf/tst-dlopen-offset.c144
5 files changed, 184 insertions, 0 deletions
diff --git a/elf/Makefile b/elf/Makefile
index f1fda1d61d..8f16690c25 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -180,6 +180,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
 	 tst-tls16 tst-tls17 tst-tls18 tst-tls19 tst-tls-dlinfo \
 	 tst-align tst-align2 $(tests-execstack-$(have-z-execstack)) \
 	 tst-dlmodcount tst-dlopenrpath tst-deep1 \
+	 tst-dlopen-offset \
 	 tst-dlmopen1 tst-dlmopen3 \
 	 unload3 unload4 unload5 unload6 unload7 unload8 tst-global1 order2 \
 	 tst-audit1 tst-audit2 tst-audit8 tst-audit9 \
@@ -277,6 +278,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
 		tst-audit12mod1 tst-audit12mod2 tst-audit12mod3 tst-auditmod12 \
 		tst-latepthreadmod $(tst-tls-many-dynamic-modules) \
 		tst-nodelete-dlclose-dso tst-nodelete-dlclose-plugin \
+		tst-dlopen-offset-mod1 tst-dlopen-offset-mod2 tst-dlopen-offset-mod3 \
 		tst-main1mod tst-libc_dlvsym-dso
 ifeq (yes,$(have-mtls-dialect-gnu2))
 tests += tst-gnu2-tls1
@@ -1457,3 +1459,10 @@ $(objpfx)tst-libc_dlvsym-static: $(common-objpfx)dlfcn/libdl.a
 tst-libc_dlvsym-static-ENV = \
   LD_LIBRARY_PATH=$(objpfx):$(common-objpfx):$(common-objpfx)dlfcn
 $(objpfx)tst-libc_dlvsym-static.out: $(objpfx)tst-libc_dlvsym-dso.so
+
+$(objpfx)tst-dlopen-offset: $(libdl)
+$(objpfx)tst-dlopen-offset.out: $(objpfx)tst-dlopen-offset-comb.so
+$(objpfx)tst-dlopen-offset-comb.so: $(objpfx)tst-dlopen-offset-mod1.so $(objpfx)tst-dlopen-offset-mod2.so $(objpfx)tst-dlopen-offset-mod3.so
+	dd if=$(objpfx)tst-dlopen-offset-mod1.so of=$(objpfx)tst-dlopen-offset-comb.so bs=1024 seek=64
+	dd if=$(objpfx)tst-dlopen-offset-mod2.so of=$(objpfx)tst-dlopen-offset-comb.so bs=1024 seek=128
+	dd if=$(objpfx)tst-dlopen-offset-mod3.so of=$(objpfx)tst-dlopen-offset-comb.so bs=1024 seek=192
diff --git a/elf/tst-dlopen-offset-mod1.c b/elf/tst-dlopen-offset-mod1.c
new file mode 100644
index 0000000000..e46ced868f
--- /dev/null
+++ b/elf/tst-dlopen-offset-mod1.c
@@ -0,0 +1,15 @@
+#include <stdio.h>
+
+int
+foo (void)
+{
+  printf ("In %s:%s\n", __FILE__, __func__);
+  return 1;
+}
+
+int
+foosub (void)
+{
+  printf ("In %s:%s\n", __FILE__, __func__);
+  return 20;
+}
diff --git a/elf/tst-dlopen-offset-mod2.c b/elf/tst-dlopen-offset-mod2.c
new file mode 100644
index 0000000000..d126ae2fc1
--- /dev/null
+++ b/elf/tst-dlopen-offset-mod2.c
@@ -0,0 +1,8 @@
+#include <stdio.h>
+
+int
+bar (void)
+{
+  printf ("In %s:%s\n", __FILE__, __func__);
+  return 123;
+}
diff --git a/elf/tst-dlopen-offset-mod3.c b/elf/tst-dlopen-offset-mod3.c
new file mode 100644
index 0000000000..9916dc8101
--- /dev/null
+++ b/elf/tst-dlopen-offset-mod3.c
@@ -0,0 +1,8 @@
+#include <stdio.h>
+
+int
+xyzzy (void)
+{
+  printf ("In %s:%s\n", __FILE__, __func__);
+  return 21;
+}
diff --git a/elf/tst-dlopen-offset.c b/elf/tst-dlopen-offset.c
new file mode 100644
index 0000000000..78dd7ca892
--- /dev/null
+++ b/elf/tst-dlopen-offset.c
@@ -0,0 +1,144 @@
+#include <dlfcn.h>
+#include <stdio.h>
+
+/* These numbers need to be coordinated with the offsets passed to make the combined .so.  */
+int offa = 64;
+int offb = 128;
+int offc = 192;
+
+int
+do_test (void)
+{
+  void *p1 = __google_dlopen_with_offset ("$ORIGIN/tst-dlopen-offset-comb.so", offa * 1024, RTLD_LAZY);
+
+  if (!p1)
+    {
+      puts (dlerror ());
+      return 1;
+    }
+
+  int (*f) (void) = dlsym (p1, "foo");
+  if (f)
+    {
+      (*f)();
+    }
+  else
+    {
+      puts (dlerror ());
+      return 1;
+    }
+
+  void *p2 = __google_dlopen_with_offset ("$ORIGIN/tst-dlopen-offset-comb.so", offb * 1024, RTLD_LAZY);
+
+  int (*bar) (void) = dlsym (p2, "bar");
+  if (bar)
+    {
+      (*bar)();
+    }
+  else
+    {
+      puts (dlerror ());
+      return 1;
+    }
+
+  void *p3 = __google_dlopen_with_offset ("$ORIGIN/tst-dlopen-offset-comb.so", offc * 1024, RTLD_LAZY);
+
+  int (*xyzzy) (void) = dlsym (p3, "xyzzy");
+  if (xyzzy)
+    {
+      (*xyzzy)();
+    }
+  else
+    {
+      puts (dlerror ());
+      return 1;
+    }
+
+  if (p1)
+    dlclose (p1);
+
+  p1 = __google_dlopen_with_offset ("$ORIGIN/tst-dlopen-offset-comb.so", offa * 1024, RTLD_LAZY);
+
+  f = dlsym (p1, "someothersym");
+  if (!f)
+    {
+      puts (dlerror ());
+      puts (" (expected)");
+    }
+  else
+    {
+      puts ("Symbol found unexpectedly");
+      return 1;
+    }
+
+  f = dlsym (p1, "xyzzy");
+  if (!f)
+    {
+      puts (dlerror ());
+      puts (" (expected)");
+    }
+  else
+    {
+      puts ("Symbol found unexpectedly");
+      return 1;
+    }
+
+  p1 = __google_dlopen_with_offset ("$ORIGIN/tst-dlopen-offset-comb.so", offa * 1024, RTLD_LAZY);
+
+  f = dlsym (p1, "foo");
+  if (f)
+    {
+      (*f)();
+    }
+  else
+    {
+      puts (dlerror ());
+      return 1;
+    }
+
+  void *px = __google_dlopen_with_offset ("$ORIGIN/tst-dlopen-offset-comb.so", 0, RTLD_LAZY);
+
+  if (!px)
+    {
+      puts (dlerror ());
+      puts (" (expected)");
+    }
+  else
+    {
+      puts ("dlopen_with_offset succeeded unexpectedly");
+      return 1;
+    }
+
+  px = __google_dlopen_with_offset ("$ORIGIN/tst-dlopen-offset-mod1.so", 0, RTLD_LAZY);
+
+  f = dlsym (px, "foo");
+  if (f)
+    {
+      (*f)();
+    }
+  else
+    {
+      puts (dlerror ());
+      return 1;
+    }
+
+  px = __google_dlopen_with_offset ("$ORIGIN/nonexistent.so", 0, RTLD_LAZY);
+
+  if (!px)
+    {
+      puts (dlerror ());
+      puts (" (expected)");
+    }
+  else
+    {
+      puts ("dlopen_with_offset succeeded unexpectedly");
+      return 1;
+    }
+
+  return 0;
+}
+
+#define TIMEOUT 100
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"