]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Extend elf/unload8 to test an additional load/unload pattern
authorStan Shebs <stanshebs@google.com>
Thu, 15 Jul 2021 19:57:50 +0000 (12:57 -0700)
committerFangrui Song <i@maskray.me>
Sat, 28 Aug 2021 00:26:06 +0000 (17:26 -0700)
elf/Makefile
elf/unload8.c
elf/unload8mod1.c

index 827fe13178c9939f11f2a22adadeb01f57a99f9a..43604e7d84db089b8d4c278180dea255515064d2 100644 (file)
@@ -652,7 +652,7 @@ $(objpfx)unload6mod2.so: $(libdl)
 $(objpfx)unload6mod3.so: $(libdl)
 $(objpfx)unload7mod1.so: $(libdl)
 $(objpfx)unload7mod2.so: $(objpfx)unload7mod1.so
-$(objpfx)unload8mod1.so: $(objpfx)unload8mod2.so
+$(objpfx)unload8mod1.so: $(objpfx)unload8mod2.so $(libdl)
 $(objpfx)unload8mod2.so: $(objpfx)unload8mod3.so
 $(objpfx)unload8mod3.so: $(libdl)
 $(objpfx)tst-initordera2.so: $(objpfx)tst-initordera1.so
index f984a38098f49f7cdc4e1894ee120165aeb23f67..363af13d54ef278fa42f5005db74edff39d4f87b 100644 (file)
@@ -27,7 +27,48 @@ main (void)
     }
 
   mod1 ();
+
+  // Additional test to detect when the fastload hash table has bad pointers to
+  // names of unloaded libraries hanging around in it.
+
+  int (*mod1b) (void) = dlsym (h, "mod1b");
+  if (mod1b == NULL)
+    {
+      puts ("dlsym failed");
+      return 1;
+    }
+
+  mod1b ();
+
   dlclose (h);
 
+  void *h2x = dlopen ("$ORIGIN/unload8mod2.so", RTLD_LAZY);
+  if (h2x == NULL)
+    {
+      puts ("dlopen unload8mod2.so failed");
+      return 1;
+    }
+
+
+  void *h2xx = dlopen ("$ORIGIN/unload8mod1x.so", RTLD_LAZY);
+  if (h2xx == NULL)
+    {
+      puts ("dlopen unload8mod1x.so failed");
+      return 1;
+    }
+
+  dlclose (h);
+  dlclose (h2x);
+  dlclose (h2xx);
+
+  void *h3xx = dlopen ("$ORIGIN/unload8mod3.so", RTLD_LAZY);
+  if (h3xx == NULL)
+    {
+      puts ("dlopen unload8mod3.so failed");
+      return 1;
+    }
+
+  dlclose (h3xx);
+
   return 0;
 }
index fe7e81c1c37dfb5cb1844ae1bf43c0216775f3a8..42a4298b6ec2a3388c0e9f6649590f0f069f9809 100644 (file)
@@ -1,3 +1,5 @@
+#include <dlfcn.h>
+
 extern void mod2 (void);
 
 void
@@ -5,3 +7,14 @@ mod1 (void)
 {
   mod2 ();
 }
+
+void
+mod1b (void)
+{
+  void *h = dlopen ("$ORIGIN/unload8mod3.so", RTLD_LAZY);
+  if (h == NULL)
+    {
+      puts ("dlopen unload8mod3.so failed");
+      return 1;
+    }
+}