Message ID | 20210322154111.24798-3-vivek@collabora.com |
---|---|
State | New |
Headers | show |
Series | Implementation of RTLD_SHARED for dlmopen | expand |
LGTM with the small fix below. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> On 22/03/2021 12:41, Vivek Das Mohapatra via Libc-alpha wrote: > --- > elf/dl-load.c | 38 ++++++++++++++++++++++++++++++++++++++ > sysdeps/generic/ldsodefs.h | 4 ++++ > 2 files changed, 42 insertions(+) > > diff --git a/elf/dl-load.c b/elf/dl-load.c > index 2f760503c5..3ffb83cb6a 100644 > --- a/elf/dl-load.c > +++ b/elf/dl-load.c > @@ -2007,6 +2007,44 @@ open_path (const char *name, size_t namelen, int mode, > return -1; > } > > +/* Search for a shared object in a given namespace. */ > +struct link_map * > +_dl_find_dso (const char *name, Lmid_t nsid) > +{ > + struct link_map *l; > + > + for (l = GL(dl_ns)[nsid]._ns_loaded; l; l = l->l_next) No implicit check: for (l = GL(dl_ns)[nsid]._ns_loaded; l != NULL; l = l->l_next) > + { > + /* If the requested name matches the soname of a loaded object, > + use that object. Elide this check for names that have not > + yet been opened. */ > + if (__glibc_unlikely ((l->l_faked | l->l_removed) != 0)) > + continue; > + if (!_dl_name_match_p (name, l)) > + { > + const char *soname; > + > + if (__glibc_likely (l->l_soname_added) > + || l->l_info[DT_SONAME] == NULL) > + continue; > + > + soname = ((const char *) D_PTR (l, l_info[DT_STRTAB]) > + + l->l_info[DT_SONAME]->d_un.d_val); > + if (strcmp (name, soname) != 0) > + continue; > + > + /* We have a match on a new name -- cache it. */ > + add_name_to_object (l, soname); > + l->l_soname_added = 1; > + } > + > + /* We have a match. */ > + return l; > + } > + > + return NULL; > +} > + > /* Map in the shared object file NAME. */ > > struct link_map * Ok. > diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h > index ea3f7a69d0..08791fbc0f 100644 > --- a/sysdeps/generic/ldsodefs.h > +++ b/sysdeps/generic/ldsodefs.h > @@ -1241,6 +1241,10 @@ extern void _dl_show_scope (struct link_map *new, int from) > extern struct link_map *_dl_find_dso_for_object (const ElfW(Addr) addr); > rtld_hidden_proto (_dl_find_dso_for_object) > > +extern struct link_map *_dl_find_dso (const char *name, Lmid_t nsid); > +rtld_hidden_proto (_dl_find_dso) > + > + > /* Initialization which is normally done by the dynamic linker. */ > extern void _dl_non_dynamic_init (void) > attribute_hidden; > Ok.
diff --git a/elf/dl-load.c b/elf/dl-load.c index 2f760503c5..3ffb83cb6a 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -2007,6 +2007,44 @@ open_path (const char *name, size_t namelen, int mode, return -1; } +/* Search for a shared object in a given namespace. */ +struct link_map * +_dl_find_dso (const char *name, Lmid_t nsid) +{ + struct link_map *l; + + for (l = GL(dl_ns)[nsid]._ns_loaded; l; l = l->l_next) + { + /* If the requested name matches the soname of a loaded object, + use that object. Elide this check for names that have not + yet been opened. */ + if (__glibc_unlikely ((l->l_faked | l->l_removed) != 0)) + continue; + if (!_dl_name_match_p (name, l)) + { + const char *soname; + + if (__glibc_likely (l->l_soname_added) + || l->l_info[DT_SONAME] == NULL) + continue; + + soname = ((const char *) D_PTR (l, l_info[DT_STRTAB]) + + l->l_info[DT_SONAME]->d_un.d_val); + if (strcmp (name, soname) != 0) + continue; + + /* We have a match on a new name -- cache it. */ + add_name_to_object (l, soname); + l->l_soname_added = 1; + } + + /* We have a match. */ + return l; + } + + return NULL; +} + /* Map in the shared object file NAME. */ struct link_map * diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index ea3f7a69d0..08791fbc0f 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -1241,6 +1241,10 @@ extern void _dl_show_scope (struct link_map *new, int from) extern struct link_map *_dl_find_dso_for_object (const ElfW(Addr) addr); rtld_hidden_proto (_dl_find_dso_for_object) +extern struct link_map *_dl_find_dso (const char *name, Lmid_t nsid); +rtld_hidden_proto (_dl_find_dso) + + /* Initialization which is normally done by the dynamic linker. */ extern void _dl_non_dynamic_init (void) attribute_hidden;