summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStan Shebs <stanshebs@google.com>2021-07-15 12:57:50 -0700
committerFangrui Song <i@maskray.me>2021-08-27 17:26:06 -0700
commit282bbfc364e9f0c5a0b006da377af6828e2048d8 (patch)
treed3f8536dc7cdd763e19db3bf21cfb34fb2bf2107
parent8238afcd89abe20989becb1a3836291a0f8b67dd (diff)
downloadglibc-282bbfc364e9f0c5a0b006da377af6828e2048d8.tar.gz
Extend elf/unload8 to test an additional load/unload pattern
-rw-r--r--elf/Makefile2
-rw-r--r--elf/unload8.c41
-rw-r--r--elf/unload8mod1.c13
3 files changed, 55 insertions, 1 deletions
diff --git a/elf/Makefile b/elf/Makefile
index 827fe13178..43604e7d84 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -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
diff --git a/elf/unload8.c b/elf/unload8.c
index f984a38098..363af13d54 100644
--- a/elf/unload8.c
+++ b/elf/unload8.c
@@ -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;
}
diff --git a/elf/unload8mod1.c b/elf/unload8mod1.c
index fe7e81c1c3..42a4298b6e 100644
--- a/elf/unload8mod1.c
+++ b/elf/unload8mod1.c
@@ -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;
+ }
+}