fix regression in dlopen promotion from RTLD_LOCAL to RTLD_GLOBAL
commit 4ff234f6cba96403b5de6d29d48a59fd73252040 inadvertently removed
the logic to do this when changing the representation of global
status.
diff --git a/ldso/dynlink.c b/ldso/dynlink.c
index 239007f..fc6a68b 100644
--- a/ldso/dynlink.c
+++ b/ldso/dynlink.c
@@ -1771,7 +1771,8 @@
}
/* First load handling */
- if (!p->deps) {
+ int first_load = !p->deps;
+ if (first_load) {
load_deps(p);
if (!p->relocated && (mode & RTLD_LAZY)) {
prepare_lazy(p);
@@ -1779,11 +1780,15 @@
if (!p->deps[i]->relocated)
prepare_lazy(p->deps[i]);
}
+ }
+ if (first_load || (mode & RTLD_GLOBAL)) {
/* Make new symbols global, at least temporarily, so we can do
* relocations. If not RTLD_GLOBAL, this is reverted below. */
add_syms(p);
for (i=0; p->deps[i]; i++)
add_syms(p->deps[i]);
+ }
+ if (first_load) {
reloc_all(p);
}