From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from forward108j.mail.yandex.net (forward108j.mail.yandex.net [IPv6:2a02:6b8:0:801:2::253]) by sourceware.org (Postfix) with ESMTPS id D50B1383906E for ; Sat, 18 Mar 2023 16:55:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D50B1383906E Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=yandex.ru Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=yandex.ru Received: from myt6-1289f562e823.qloud-c.yandex.net (myt6-1289f562e823.qloud-c.yandex.net [IPv6:2a02:6b8:c12:259d:0:640:1289:f562]) by forward108j.mail.yandex.net (Yandex) with ESMTP id 97DE43F21E6F for ; Sat, 18 Mar 2023 19:51:55 +0300 (MSK) Received: by myt6-1289f562e823.qloud-c.yandex.net (smtp/Yandex) with ESMTPSA id cpp3fcrbC8c1-2cG5GDaS; Sat, 18 Mar 2023 19:51:55 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1679158315; bh=4bSKkG8w29kHMQzZ6Ziaj/UMJMEWp8LYmrYjDcgbgL4=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=k4uy3Pw9LaZnvvNdXE07hH83jX48YEMY6x7vxOVNis+/ICD+GDbo0onJ/ONWmON2i iHbTV9Y1oMdhll+49yKom/NCop4dyNlA+aoaWmVpGNLsIJk9mxy0FpvDF0lm8p88Pv NGHiX/YGAFSd6nfYaYhqzVunCgNhfM8l3aRqLYY0= Authentication-Results: myt6-1289f562e823.qloud-c.yandex.net; dkim=pass header.i=@yandex.ru From: Stas Sergeev To: libc-alpha@sourceware.org Cc: Stas Sergeev Subject: [PATCH 10/13] elf: convert _dl_map_object to a callback Date: Sat, 18 Mar 2023 21:51:07 +0500 Message-Id: <20230318165110.3672749-11-stsp2@yandex.ru> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20230318165110.3672749-1-stsp2@yandex.ru> References: <20230318165110.3672749-1-stsp2@yandex.ru> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,GIT_PATCH_0,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Subsequent patches will add _dl_map_object_from_memory(). The test-suite was run on x86_64/64 and showed no regressions. Signed-off-by: Stas Sergeev --- elf/dl-load.c | 12 ++++++++++-- elf/dl-main.h | 9 +++++++++ elf/dl-open.c | 25 +++++++++++++++++++++---- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/elf/dl-load.c b/elf/dl-load.c index d54a8f59ac..46bf44efa3 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -2322,8 +2322,8 @@ ___dl_map_object (struct link_map *loader, const char *name, } struct link_map * -_dl_map_object (struct link_map *loader, const char *name, - int type, int trace_mode, +__dl_map_object (struct link_map *loader, const char *name, + void *private, int type, int trace_mode, int mode, Lmid_t nsid) { struct link_map *ret; @@ -2334,6 +2334,14 @@ _dl_map_object (struct link_map *loader, const char *name, return ret; } +struct link_map * +_dl_map_object (struct link_map *loader, const char *name, + int type, int trace_mode, + int mode, Lmid_t nsid) +{ + return __dl_map_object (loader, name, NULL, type, trace_mode, mode, nsid); +} + struct add_path_state { bool counting; diff --git a/elf/dl-main.h b/elf/dl-main.h index 92766d06b4..344a87d5e8 100644 --- a/elf/dl-main.h +++ b/elf/dl-main.h @@ -104,6 +104,15 @@ struct dl_main_state bool version_info; }; +/* Open the shared object NAME and map in its segments. + LOADER's DT_RPATH is used in searching for NAME. + If the object is already opened, returns its existing map. */ +extern struct link_map * +__dl_map_object (struct link_map *loader, + const char *name, void *private, + int type, int trace_mode, int mode, + Lmid_t nsid) attribute_hidden; + /* Helper function to invoke _dl_init_paths with the right arguments from *STATE. */ static inline void diff --git a/elf/dl-open.c b/elf/dl-open.c index 91a2d8a538..f3886c21bc 100644 --- a/elf/dl-open.c +++ b/elf/dl-open.c @@ -40,6 +40,7 @@ #include #include +#include /* We must be careful not to leave us in an inconsistent state. Thus we @@ -48,6 +49,7 @@ struct dl_open_args { const char *file; + void *private; int mode; /* This is the caller of the dlopen() function. */ const void *caller_dlopen; @@ -55,6 +57,10 @@ struct dl_open_args /* Namespace ID. */ Lmid_t nsid; + struct link_map * + (*dl_map) (struct link_map *loader, const char *name, void *private, + int type, int trace_mode, int mode, Lmid_t nsid); + /* Original value of _ns_global_scope_pending_adds. Set by dl_open_worker. Only valid if nsid is a real namespace (non-negative). */ @@ -531,7 +537,7 @@ dl_open_worker_begin (void *a) /* Load the named object. */ struct link_map *new; - args->map = new = _dl_map_object (call_map, file, lt_loaded, 0, + args->map = new = args->dl_map (call_map, file, args->private, lt_loaded, 0, mode | __RTLD_CALLMAP, args->nsid); /* If the pointer returned is NULL this means the RTLD_NOLOAD flag is @@ -818,9 +824,11 @@ dl_open_worker (void *a) new->l_name, new->l_ns, new->l_direct_opencount); } -void * -_dl_open (const char *file, int mode, const void *caller_dlopen, Lmid_t nsid, - int argc, char *argv[], char *env[]) +static void * +do_dl_open (const char *file, void *private, int mode, + const void *caller_dlopen, Lmid_t nsid, + int argc, char *argv[], char *env[], + __typeof (__dl_map_object) *dl_map) { if ((mode & RTLD_BINDING_MASK) == 0) /* One of the flags must be set. */ @@ -870,10 +878,12 @@ no more namespaces available for dlmopen()")); struct dl_open_args args; args.file = file; + args.private = private; args.mode = mode; args.caller_dlopen = caller_dlopen; args.map = NULL; args.nsid = nsid; + args.dl_map = dl_map; /* args.libc_already_loaded is always assigned by dl_open_worker (before any explicit/non-local returns). */ args.argc = argc; @@ -935,6 +945,13 @@ no more namespaces available for dlmopen()")); return args.map; } +void * +_dl_open (const char *file, int mode, const void *caller_dlopen, Lmid_t nsid, + int argc, char *argv[], char *env[]) +{ + return do_dl_open (file, NULL, mode, caller_dlopen, nsid, argc, argv, env, + __dl_map_object); +} void _dl_show_scope (struct link_map *l, int from) -- 2.37.2