[RFC][PATCH v4 11/15] Use the DSO search helper to check for preloaded DF_1_UNIQUE DSOs
Vivek Das Mohapatra
vivek@collabora.com
Mon Mar 30 17:43:45 GMT 2020
If a DSO already exists (with the same name) in the base namespace
and it is flagged DF_1_UNIQUE then we should behave as if a proxy
had been requested.
---
elf/dl-open.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/elf/dl-open.c b/elf/dl-open.c
index 9265b4239a..0197cd07e0 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -476,6 +476,7 @@ dl_open_worker (void *a)
const char *file = args->file;
int mode = args->mode;
struct link_map *call_map = NULL;
+ struct link_map *preloaded = NULL;
int want_proxy = mode & RTLD_SHARED;
Lmid_t proxy_ns = LM_ID_BASE;
@@ -510,6 +511,22 @@ dl_open_worker (void *a)
may not be true if this is a recursive call to dlopen. */
_dl_debug_initialize (0, args->nsid);
+ /* Target Lmid is not the base and we haven't explicitly asked for a proxy:
+ We need to check for a matching DSO in the base Lmid in case it is flagged
+ DF_1_UNIQUE in which case we add RTLD_SHARED to the mode and set
+ want_proxy. */
+ if (__glibc_unlikely (args->nsid != LM_ID_BASE) &&
+ __glibc_likely (!want_proxy))
+ {
+ preloaded = _dl_find_dso (file, LM_ID_BASE);
+
+ if (preloaded && (preloaded->l_flags_1 & DF_1_UNIQUE))
+ {
+ want_proxy = RTLD_SHARED;
+ mode |= RTLD_SHARED;
+ }
+ }
+
/* Load the named object. */
struct link_map *new;
args->map = new = _dl_map_object (call_map, file, lt_loaded, 0,
--
2.11.0
More information about the Libc-alpha
mailing list