From patchwork Tue Nov 22 01:26:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: develop--- via Libc-alpha X-Patchwork-Id: 60955 Return-Path: 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 A022F384F6E3 for ; Tue, 22 Nov 2022 01:27:31 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A022F384F6E3 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1669080451; bh=jIJeKbmSn1kN/vfUN95c9NlUN2l8g6zFX8L53aDljLA=; h=To:CC:Subject:Date:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=Gr3clupqCKACdT3zy3qEqMD46AlxawBTvKzCrqjWIaz7HSJBFp8d82zYmQCufwcs+ 9leNTDKKTQ1k1xZI9H7Nzcw5WlT3e7dTlbNCBRtt6jpwrhEU7+fHYQ0jFOjyf+EmgN Btr8Sr0i+o26j469GmuRiQtclQj3ZLlpZcmZ8Z5g= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) by sourceware.org (Postfix) with ESMTPS id 40952385457E for ; Tue, 22 Nov 2022 01:26:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 40952385457E Received: from kwepemi500006.china.huawei.com (unknown [172.30.72.57]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4NGRRj629fzRpPb; Tue, 22 Nov 2022 09:26:25 +0800 (CST) Received: from kwepemi500012.china.huawei.com (7.221.188.12) by kwepemi500006.china.huawei.com (7.221.188.68) 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 09:26:53 +0800 Received: from kwepemi500012.china.huawei.com ([7.221.188.12]) by kwepemi500012.china.huawei.com ([7.221.188.12]) with mapi id 15.01.2375.031; Tue, 22 Nov 2022 09:26:53 +0800 To: Szabolcs Nagy CC: Florian Weimer , "Wangbing(wangbing, RTOS/Poincare Lab) via Libc-alpha" , Nixiaoming , zhongjubin , "Yanhuijun (DOPRA SSP)" Subject: resend patch//: Add testcese// [PATCH] dlsym: Add RTLD_PROBE for situation when dlsym only wants to probe a symbol but not use it Thread-Topic: resend patch//: Add testcese// [PATCH] dlsym: Add RTLD_PROBE for situation when dlsym only wants to probe a symbol but not use it Thread-Index: Adj+ERzL5v4lse32S/KxeWsKidcEkw== Date: Tue, 22 Nov 2022 01:26:53 +0000 Message-ID: <222e59052b6f44dfa435eb59280e60b5@huawei.com> Accept-Language: zh-CN, en-US Content-Language: zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.67.109.108] MIME-Version: 1.0 X-CFilter-Loop: Reflected X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00, BODY_8BITS, 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: , From: "Wangbing\(wangbing, RTOS/Poincare Lab\) via Libc-alpha" Reply-To: "Wangbing\(wangbing,RTOS/Poincare Lab\)" Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" -----邮件原件----- 发件人: Szabolcs Nagy [mailto:szabolcs.nagy@arm.com] 发送时间: 2022年11月21日 22:34 收件人: Wangbing(wangbing,RTOS/Poincare Lab) 抄送: Florian Weimer ; Wangbing(wangbing, RTOS/Poincare Lab) via Libc-alpha ; Nixiaoming ; zhongjubin ; Yanhuijun (DOPRA SSP) 主题: Re: Add testcese// [PATCH] dlsym: Add RTLD_PROBE for situation when dlsym only wants to probe a symbol but not use it The 11/21/2022 14:06, Wangbing(wangbing, RTOS/Poincare Lab) via Libc-alpha wrote: > 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 looks like the patch got corrupted. i think it would help if you could resend it. 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/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/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/tst-dlsym-rtld-probe.c b/elf/tst-dlsym-rtld-probe.c new file mode 100644 index 0000000000..84ba92c6c8 --- /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"); + 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"); + ret = dlcose (handle); + TEST_VERIFY (ret == 0); + return 0; +} + + +#include