From patchwork Mon Mar 30 17:43:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Vivek Dasmohapatra X-Patchwork-Id: 38668 Return-Path: X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [46.235.227.227]) by sourceware.org (Postfix) with ESMTPS id 85073385DC26 for ; Mon, 30 Mar 2020 17:43:57 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 85073385DC26 Received: from noise.collabora.co.uk (unknown [IPv6:2a00:5f00:102:0:c0a7:51ff:feaf:e642]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: vivek) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id B3DD52966B8; Mon, 30 Mar 2020 18:43:56 +0100 (BST) From: =?utf-8?q?Vivek_Das=C2=A0Mohapatra?= To: vivek@etla.org, libc-alpha@sourceware.org Subject: [RFC][PATCH v4 00/15] Proof-of-Concept implementation of RTLD_SHARED for dlmopen Date: Mon, 30 Mar 2020 18:43:34 +0100 Message-Id: X-Mailer: git-send-email 2.11.0 MIME-Version: 1.0 X-Spam-Status: No, score=-19.7 required=5.0 tests=BAYES_00, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, KAM_DMARC_STATUS, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 30 Mar 2020 17:43:58 -0000 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(-)