mbox series

[RFC,v4,00/15] Proof-of-Concept implementation of RTLD_SHARED for dlmopen

Message ID cover.1585588166.git.vivek@collabora.com
Headers show
Series Proof-of-Concept implementation of RTLD_SHARED for dlmopen | expand


Vivek Das Mohapatra March 30, 2020, 5:43 p.m. UTC
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

  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

 - 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(-)