| Message ID | 20211010163836.14666-1-vivek@collabora.com (mailing list archive) |
|---|---|
| Headers |
Return-Path: <libc-alpha-bounces+patchwork=sourceware.org@sourceware.org> X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 6AFCE3858422 for <patchwork@sourceware.org>; Sun, 10 Oct 2021 16:41:55 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 6AFCE3858422 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1633884115; bh=ohpYfUZKVZl3ljAzZjm5WPVUfQYec9TWiT9iP3rVo8g=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=nT4Op9GQ7ONSGp3kFrWj2MRjMEldHHXp/TF8TMs8++ffMEW11OMZNscbayPCx1eyo ejZkTTVu9ymzu3MaEUkLDrnfXGLlAOkXu9fDylKRfc0/i1sKCzH7RlVVh8w7Gd9RPR hmw7bPF4TCaRsBLX6MgWV+OehWzadgYpeOS64NiQ= 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 DA4063858405 for <libc-alpha@sourceware.org>; Sun, 10 Oct 2021 16:38:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org DA4063858405 Received: from noise.cbg.collabora.co.uk (unknown [IPv6:2001:4d48:ad5c:ef00:8e70:5aff:fe59:c29c]) (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 9F0371F42E83 for <libc-alpha@sourceware.org>; Sun, 10 Oct 2021 17:38:44 +0100 (BST) To: libc-alpha@sourceware.org Subject: [PATCH v14 0/7] Implementation of RTLD_SHARED for dlmopen Date: Sun, 10 Oct 2021 17:38:29 +0100 Message-Id: <20211010163836.14666-1-vivek@collabora.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-6.4 required=5.0 tests=BAYES_00, KAM_ASCII_DIVIDERS, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=no autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list <libc-alpha.sourceware.org> List-Unsubscribe: <https://sourceware.org/mailman/options/libc-alpha>, <mailto:libc-alpha-request@sourceware.org?subject=unsubscribe> List-Archive: <https://sourceware.org/pipermail/libc-alpha/> List-Post: <mailto:libc-alpha@sourceware.org> List-Help: <mailto:libc-alpha-request@sourceware.org?subject=help> List-Subscribe: <https://sourceware.org/mailman/listinfo/libc-alpha>, <mailto:libc-alpha-request@sourceware.org?subject=subscribe> From: =?utf-8?q?Vivek_Das=C2=A0Mohapatra_via_Libc-alpha?= <libc-alpha@sourceware.org> Reply-To: =?utf-8?q?Vivek_Das=C2=A0Mohapatra?= <vivek@collabora.com> Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" <libc-alpha-bounces+patchwork=sourceware.org@sourceware.org> |
| Series |
Implementation of RTLD_SHARED for dlmopen
|
|
Message
Vivek Dasmohapatra
Oct. 10, 2021, 4:38 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
Introduction:
=======================================================================
As discussed in the URL above dlmopen requires a mechanism for
[optionally] sharing some objects between more than one namespace.
The following patchset provides 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.
In addition a new ELF dynamic section and flag are introduced which
indicate that the DSO in question should be shared between namespaces
by default, and the core libc DSOs are tagged as such by default.
This patch series should address all the comments received on the
earlier (v1-v13) series.
=======================================================================
Changes from v13:
- The following DSOs no longer have the new flag since they are stubs:
nptl/libpthread, dlfcn/libdl, login/libutil, resolv/libanl
- htl/libpthread still flagged, since htl pthread has not been merged
- NOTE: resolv/libanl depends on {htl,nptl}/pthread but is not flagged
which I believe to be the correct state of affairs
- Tests now use a purpose built DT_GNU_FLAGS_1/DF_GNU_1_UNIQUE
library to make sure DT_NEEDED support works (they used librt before
but we no longer assume librt will keep being flagged)
- Patchset updated to cope with dl_open_worker being split into two
functions.
- Incorporated most of the changes from azanella/rtld-shared, EXCEPT:
- Makeconfig variable ld-zunique/ld_zunique change propagated to the
rest of the build system so that DT_GNU_FLAGS_1 is added when the
linker has -z unique support (as well).
- dl-lookup.c had: current_value.m->l_name == LM_ID_BASE
corrected to: current_value.m->l_ns == LM_ID_BASE
- dl-open,c: A check on whether GL(dl_ns)[args->nsid].libc_map had been set
had been removed, with the comment: "dlopen cannot be used to load an
initial libc by design", but that was not what this check was for.
In a secondary namespace it is possible for there to be no libc_map stored
at that location, so we should not unconditionally call libc init on it.
- Not all changes to the tests incorporated as they would have inverted
the return values of at least one helper function, with knock-on changes
being required as a result.
Changes from v12:
- Added NEWS entry.
- Updated patch series to glibc 2.35 as a base.
- The following DSOs no longer have the new flag since they are stubs:
{htl,nptl}/libpthread, dlfcn/libdl, login/libutil, resolv/libanl
Changes from v11:
- If a DSO is required in a non-base namespace because it is mentioned
in a DT_NEEDED entry and it is itself flagged DF_GNU_1_UNIQUE then
a proxy is generated for it.
- Relocations via non-base namespace proxies work reliably (some code
paths did not do the address calculation relative to the DSO base
correctly when a proxy was involved).
- Tests extended cover the above two scenarios.
Not changed:
- There is still some diagnostic info in the config.log when the linker
layout is acceptable but -z unique is not yet supported. I believe this
_is_ useful diagnostic information as a developer might otherwise wonder
why the vanilla linker was being rejected when its layout output seemed
fine.
I have not yet implemented, but plan to address once this series is
accepted/acceptable:
- dl_iterate_ns_phdr (cf dl_iterate_phdr but taking a namespace argument)
- Check RTLD_GLOBAL interacts properly and unsurprisingly with RTLD_SHARED.
Vivek Das Mohapatra (7):
Define a new dynamic section tag - DT_GNU_FLAGS_1 (bug 22745)
Abstract loaded-DSO search code into a helper function
Use the new DSO finder helper function
Add DT_GNU_FLAGS_1/DF_GNU_1_UNIQUE to glibc DSOs (bug 22745)
Implement dlmopen RTLD_SHARED flag (bug 22745)
Add dlmopen / RTLD_SHARED tests
NEWS for RTLD_SHARED, RTLD_ISOLATE & DT_GNU_FLAGS_1/DF_GNU_1_UNIQUE
Makeconfig | 3 +
Makerules | 18 +-
NEWS | 17 +
bits/dlfcn.h | 10 +
configure | 50 +-
configure.ac | 24 +-
dlfcn/Makefile | 1 +
elf/Makefile | 110 +++-
elf/dl-close.c | 41 +-
elf/dl-deps.c | 17 +
elf/dl-fini.c | 6 +-
elf/dl-init.c | 4 +-
elf/dl-load.c | 236 +++++--
elf/dl-lookup.c | 23 +-
elf/dl-object.c | 83 +++
elf/dl-open.c | 162 ++++-
elf/dl-sym.c | 14 +
elf/dynamic-notes.c | 4 +
elf/elf.h | 7 +-
elf/get-dynamic-info.h | 12 +
elf/rtld.c | 2 +-
elf/tst-dlmopen-auditmod.c | 23 +
elf/tst-dlmopen-common.h | 38 ++
elf/tst-dlmopen-main.h | 928 +++++++++++++++++++++++++++
elf/tst-dlmopen-rtld-audit-shared1.c | 7 +
elf/tst-dlmopen-rtld-audit-shared2.c | 7 +
elf/tst-dlmopen-rtld-audit-shared3.c | 7 +
elf/tst-dlmopen-rtld-audit-shared4.c | 7 +
elf/tst-dlmopen-rtld-audit-shared5.c | 7 +
elf/tst-dlmopen-rtld-audit-shared6.c | 7 +
elf/tst-dlmopen-rtld-audit-unique1.c | 7 +
elf/tst-dlmopen-rtld-audit-unique2.c | 7 +
elf/tst-dlmopen-rtld-audit-unique3.c | 7 +
elf/tst-dlmopen-rtld-audit-unique4.c | 7 +
elf/tst-dlmopen-rtld-audit-unique5.c | 7 +
elf/tst-dlmopen-rtld-audit-unique6.c | 7 +
elf/tst-dlmopen-rtld-shared1.c | 7 +
elf/tst-dlmopen-rtld-shared1.h | 64 ++
elf/tst-dlmopen-rtld-shared2.c | 7 +
elf/tst-dlmopen-rtld-shared2.h | 66 ++
elf/tst-dlmopen-rtld-shared3.c | 7 +
elf/tst-dlmopen-rtld-shared3.h | 43 ++
elf/tst-dlmopen-rtld-shared4.c | 7 +
elf/tst-dlmopen-rtld-shared4.h | 14 +
elf/tst-dlmopen-rtld-shared5.c | 7 +
elf/tst-dlmopen-rtld-shared5.h | 25 +
elf/tst-dlmopen-rtld-shared6.c | 7 +
elf/tst-dlmopen-rtld-shared6.h | 36 ++
elf/tst-dlmopen-rtld-unique1.c | 7 +
elf/tst-dlmopen-rtld-unique1.h | 86 +++
elf/tst-dlmopen-rtld-unique2.c | 7 +
elf/tst-dlmopen-rtld-unique2.h | 25 +
elf/tst-dlmopen-rtld-unique3.c | 7 +
elf/tst-dlmopen-rtld-unique3.h | 13 +
elf/tst-dlmopen-rtld-unique4.c | 7 +
elf/tst-dlmopen-rtld-unique4.h | 14 +
elf/tst-dlmopen-rtld-unique5.c | 7 +
elf/tst-dlmopen-rtld-unique5.h | 58 ++
elf/tst-dlmopen-rtld-unique6.c | 7 +
elf/tst-dlmopen-rtld-unique6.h | 51 ++
elf/tst-dlmopen-sharedmod-norm.c | 37 ++
elf/tst-dlmopen-sharedmod-uniq.c | 37 ++
elf/tst-dlmopen-std-do-test.c | 12 +
elf/tst-dlmopen-unique-dep.c | 6 +
elf/tst-dlmopen-unique-dep.h | 6 +
elf/tst-tls-ie-dlmopen.c | 7 +-
extra-lib.mk | 31 +
htl/Makefile | 2 +
iconvdata/Makefile | 3 +
iconvdata/extra-module.mk | 4 +
include/elf.h | 2 +
include/link.h | 7 +-
login/Makefile | 1 +
nptl/Makefile | 5 +-
resolv/Makefile | 2 +
sysdeps/generic/ldsodefs.h | 11 +
sysdeps/mips/bits/dlfcn.h | 10 +
77 files changed, 2570 insertions(+), 109 deletions(-)
create mode 100644 elf/dynamic-notes.c
create mode 100644 elf/tst-dlmopen-auditmod.c
create mode 100644 elf/tst-dlmopen-common.h
create mode 100644 elf/tst-dlmopen-main.h
create mode 100644 elf/tst-dlmopen-rtld-audit-shared1.c
create mode 100644 elf/tst-dlmopen-rtld-audit-shared2.c
create mode 100644 elf/tst-dlmopen-rtld-audit-shared3.c
create mode 100644 elf/tst-dlmopen-rtld-audit-shared4.c
create mode 100644 elf/tst-dlmopen-rtld-audit-shared5.c
create mode 100644 elf/tst-dlmopen-rtld-audit-shared6.c
create mode 100644 elf/tst-dlmopen-rtld-audit-unique1.c
create mode 100644 elf/tst-dlmopen-rtld-audit-unique2.c
create mode 100644 elf/tst-dlmopen-rtld-audit-unique3.c
create mode 100644 elf/tst-dlmopen-rtld-audit-unique4.c
create mode 100644 elf/tst-dlmopen-rtld-audit-unique5.c
create mode 100644 elf/tst-dlmopen-rtld-audit-unique6.c
create mode 100644 elf/tst-dlmopen-rtld-shared1.c
create mode 100644 elf/tst-dlmopen-rtld-shared1.h
create mode 100644 elf/tst-dlmopen-rtld-shared2.c
create mode 100644 elf/tst-dlmopen-rtld-shared2.h
create mode 100644 elf/tst-dlmopen-rtld-shared3.c
create mode 100644 elf/tst-dlmopen-rtld-shared3.h
create mode 100644 elf/tst-dlmopen-rtld-shared4.c
create mode 100644 elf/tst-dlmopen-rtld-shared4.h
create mode 100644 elf/tst-dlmopen-rtld-shared5.c
create mode 100644 elf/tst-dlmopen-rtld-shared5.h
create mode 100644 elf/tst-dlmopen-rtld-shared6.c
create mode 100644 elf/tst-dlmopen-rtld-shared6.h
create mode 100644 elf/tst-dlmopen-rtld-unique1.c
create mode 100644 elf/tst-dlmopen-rtld-unique1.h
create mode 100644 elf/tst-dlmopen-rtld-unique2.c
create mode 100644 elf/tst-dlmopen-rtld-unique2.h
create mode 100644 elf/tst-dlmopen-rtld-unique3.c
create mode 100644 elf/tst-dlmopen-rtld-unique3.h
create mode 100644 elf/tst-dlmopen-rtld-unique4.c
create mode 100644 elf/tst-dlmopen-rtld-unique4.h
create mode 100644 elf/tst-dlmopen-rtld-unique5.c
create mode 100644 elf/tst-dlmopen-rtld-unique5.h
create mode 100644 elf/tst-dlmopen-rtld-unique6.c
create mode 100644 elf/tst-dlmopen-rtld-unique6.h
create mode 100644 elf/tst-dlmopen-sharedmod-norm.c
create mode 100644 elf/tst-dlmopen-sharedmod-uniq.c
create mode 100644 elf/tst-dlmopen-std-do-test.c
create mode 100644 elf/tst-dlmopen-unique-dep.c
create mode 100644 elf/tst-dlmopen-unique-dep.h
Comments
Looks like this has regressed wrt v12 - I suspect the reorganisation of the has_gnu_unique code, but not sure yet. Looking into it.