From patchwork Tue Nov 22 02:30:41 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Bing X-Patchwork-Id: 1707634 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha256 header.s=default header.b=fOwF13YQ; dkim-atps=neutral Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4NGStY6pr7z23nR for ; Tue, 22 Nov 2022 13:31:17 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8894038582BD for ; Tue, 22 Nov 2022 02:31:13 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8894038582BD DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1669084273; bh=B7yJRG4J/R24WWdmFLryJpVaSzn9qXZ3XPVi+eLH6AU=; h=To:CC:Subject:Date:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=fOwF13YQzDTkfiETsZQB4v5rDqiAc0p6jCB1NvwRklDnmHbTHd9BBgDrFW8o3x9ox uTSKvVkCmwEEKZRMdUbFmBSHG7qazoBG9Hef1mchU9WRcU7ObO7zX4cTNurIfn60i9 XqZhwbNnocUXAty43enI05TlgwrOEQJZfqqkhf10= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from szxga03-in.huawei.com (szxga03-in.huawei.com [45.249.212.189]) by sourceware.org (Postfix) with ESMTPS id 581063858C27 for ; Tue, 22 Nov 2022 02:30:55 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 581063858C27 Received: from kwepemi500012.china.huawei.com (unknown [172.30.72.54]) by szxga03-in.huawei.com (SkyGuard) with ESMTP id 4NGSpK4y9gzJnWW; Tue, 22 Nov 2022 10:27:37 +0800 (CST) Received: from linux-suse12sp5.huawei.com (10.67.133.76) by kwepemi500012.china.huawei.com (7.221.188.12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Tue, 22 Nov 2022 10:30:52 +0800 To: , CC: , , Subject: [PATCH] dlsym: Add RTLD_PROBE to dlsym only probe symbol without add dependency. Date: Tue, 22 Nov 2022 10:30:41 +0800 Message-ID: <20221122023041.36724-1-wangbing6@huawei.com> X-Mailer: git-send-email 2.12.3 MIME-Version: 1.0 X-Originating-IP: [10.67.133.76] X-ClientProxiedBy: dggems703-chm.china.huawei.com (10.3.19.180) To kwepemi500012.china.huawei.com (7.221.188.12) X-CFilter-Loop: Reflected X-Spam-Status: No, score=-13.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_SHORT, 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 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-Patchwork-Original-From: Wang Bing via Libc-alpha From: Wang Bing Reply-To: Wang Bing Errors-To: libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org Sender: "Libc-alpha" Signed-off-by: Wang Bing --- dlfcn/dlfcn.h | 4 ++++ elf/Makefile | 1 + elf/dl-sym.c | 13 +++++++++--- elf/tst-dlsym-rtld-probe.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 elf/tst-dlsym-rtld-probe.c diff --git a/dlfcn/dlfcn.h b/dlfcn/dlfcn.h index 6f7cad8682..ab709883a6 100644 --- a/dlfcn/dlfcn.h +++ b/dlfcn/dlfcn.h @@ -49,6 +49,10 @@ typedef long int Lmid_t; is returned. */ #define RTLD_DEFAULT ((void *) 0) +/* If only find sym in the global scope, but will not use it, do not + set sym dependency. */ +# define RTLD_PROBE ((void *) -2l) + __BEGIN_DECLS /* Open the shared object FILE and map it in; return a handle that can be diff --git a/elf/Makefile b/elf/Makefile index eca7b28ab5..f9fc9fbebb 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -472,6 +472,7 @@ tests += \ unload7 \ unload8 \ valgrind-test \ + tst-dlsym-rtld-probe \ # tests tests-cxx = \ tst-dlopen-nodelete-reloc \ diff --git a/elf/dl-sym.c b/elf/dl-sym.c index b1cf42f36d..bc95b12a19 100644 --- a/elf/dl-sym.c +++ b/elf/dl-sym.c @@ -92,10 +92,17 @@ do_sym (void *handle, const char *name, void *who, /* Link map of the caller if needed. */ struct link_map *match = NULL; - if (handle == RTLD_DEFAULT) + int def_flags; + + if (handle == RTLD_DEFAULT || handle == RTLD_PROBE) { match = _dl_sym_find_caller_link_map (caller); + def_flags = flags + if (def_flags == RTLD_DEFAULT) { + def_flags != DL_LOOKUP_ADD_DEPENDENCY; + } + /* Search the global scope. We have the simple case where we look up in the scope of an object which was part of the initial binary. And then the more complex part @@ -104,7 +111,7 @@ do_sym (void *handle, const char *name, void *who, if (RTLD_SINGLE_THREAD_P) result = GLRO(dl_lookup_symbol_x) (name, match, &ref, match->l_scope, vers, 0, - flags | DL_LOOKUP_ADD_DEPENDENCY, + def_flags, NULL); else { @@ -113,7 +120,7 @@ do_sym (void *handle, const char *name, void *who, args.map = match; args.vers = vers; args.flags - = flags | DL_LOOKUP_ADD_DEPENDENCY | DL_LOOKUP_GSCOPE_LOCK; + = def_flags | DL_LOOKUP_GSCOPE_LOCK; args.refp = &ref; THREAD_GSCOPE_SET_FLAG (); diff --git a/elf/tst-dlsym-rtld-probe.c b/elf/tst-dlsym-rtld-probe.c new file mode 100644 index 0000000000..c72ceaa182 --- /dev/null +++ b/elf/tst-dlsym-rtld-probe.c @@ -0,0 +1,50 @@ +/* Test RTLD_PROBE for dlsym. + Copyright (C) 2022-2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include +#include +#include + +static int +do_test (void) +{ + int *iptr; + int ret; + void *handle; + + handle = dlopen (LIBM_SO, RTLD_LAZY); + TEST_VERIFY (handle == NULL); + iptr = (int *)dlsym (RTLD_PROBE, "finite"); // get sym but not call --detect if symbol exist + ret = dlclose (handle); + TEST_VERIFY (ret != 0); + ret = 0; + + handle = dlopen (LIBM_SO, RTLD_LAZY); + TEST_VERIFY (handle == NULL); + iptr = (int *)dlsym (RTLD_DEFAULT, "finite"); // get sym and keep + ret = dlcose (handle); + TEST_VERIFY (ret == 0); + return 0; +} + + +#include