[RFC][PATCH v4 00/15] Proof-of-Concept implementation of RTLD_SHARED for dlmopen
Vivek Das Mohapatra
vivek@collabora.com
Mon Mar 30 17:43:34 GMT 2020
This is a revision of a previous patchset that I posted here
regarding https://sourceware.org/bugzilla/show_bug.cgi?id=22745
Since it has been some time since I had a chance to work on this
I will recap the previous introduction;
=======================================================================
As discussed in the URL above dlmopen requires a mechanism for
[optionally] sharing some objects between more than one namespace.
The following patchset attempts an implementation for this: If an
object is loaded with the new RTLD_SHARED flag we instead ensure
that a "master" copy exists (and is flagged as no-delete) in the
main namespace and a thin wrapper or clone is placed in the target
namespace.
This patch series should address all the comments received on the
earlier (v1) series, and fixes a bug in the previous (v2) series
which left the r_debug struct in an inconsistent state when creating
a proxy triggered the initial load of a DSO into the main namespace.
=======================================================================
In addition this patch series now mplements the following:
- dlmopen will implicitly apply RTLD_SHARED to the libc/libpthread group
(requires a patched binutils/ld so that the libc family of DSOs can
be flagged as requiring this behaviour)
- LD_AUDIT paths will not apply this implict sharing rule, so audit libraries
will continue to be completely isolated.
Currently the user cannot suppress this implicit sharing but that
could easily be achieved by renaming __RTLD_ISOLATE to RTLD_ISOLATE
and potting it with the other public dlopen/dlmopen mode flags.
I have not yet implemented, but plan to address once this series is
accepted/acceptable:
- Sensible RTLD_GLOBAL semantics for dlmopened DSOs in non-base namespaces
- dl_iterate_ns_phdr (cf dl_iterate_phdr but taking a namespace argument)
Vivek Das Mohapatra (15):
Declare and describe the dlmopen RTLD_SHARED flag
include/link.h: Update the link_map struct to allow proxies
elf/dl-object.c: Implement a helper function to proxy link_map entries
elf/dl-load.c, elf-dl-open.c: Implement RTLD_SHARED dlmopen proxying
elf/dl-fini.c: Handle proxy link_map entries in the shutdown path
elf/dl-init.c: Skip proxied link map entries in the dl init path
Define a new DT_FLAGS_1 flag - DF_1_UNIQUE
Abstract the loaded-DSO search code into a private helper function
Compare loaded DSOs by file ID and check for DF_1_UNIQUE
Use the new DSO finder helper function since we have it
Use the DSO search helper to check for preloaded DF_1_UNIQUE DSOs
When loading new DSOs into alternate namespaces check for DF_1_UNIQUE
Suppress inter-namespace DSO sharing for audit libraries
dlsym, dlvsym should be able to look up symbols via DSO proxies
Add the DT_FLAGS_1 DF_1_UNIQUE flag to the glibc cluster
Makeconfig | 1 +
Makerules | 2 +-
bits/dlfcn.h | 7 ++
elf/dl-close.c | 43 ++++++----
elf/dl-fini.c | 6 +-
elf/dl-init.c | 4 +-
elf/dl-load.c | 208 +++++++++++++++++++++++++++++++++++++++------
elf/dl-object.c | 84 ++++++++++++++++++
elf/dl-open.c | 90 +++++++++++++++++++-
elf/dl-sym.c | 14 +++
elf/elf.h | 1 +
elf/rtld.c | 2 +-
iconvdata/Makefile | 1 +
include/dlfcn.h | 1 +
include/elf.h | 2 +-
include/link.h | 6 +-
nptl/Makefile | 2 +-
sysdeps/generic/ldsodefs.h | 9 ++
sysdeps/mips/bits/dlfcn.h | 7 ++
19 files changed, 435 insertions(+), 55 deletions(-)
--
2.11.0
More information about the Libc-alpha
mailing list