From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-oi1-x22d.google.com (mail-oi1-x22d.google.com [IPv6:2607:f8b0:4864:20::22d]) by sourceware.org (Postfix) with ESMTPS id A895D382E905 for ; Fri, 20 May 2022 11:27:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org A895D382E905 Received: by mail-oi1-x22d.google.com with SMTP id q8so9567300oif.13 for ; Fri, 20 May 2022 04:27:56 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:references:from:in-reply-to :content-transfer-encoding; bh=sDpueVzvu2CqUHr+1qP7rY80ZHOf2D5nQRMbqP73byg=; b=lR2+g96dMBpuk8KfWMSop57GVro9Pb4VJ0BcmqnKfVi0Mhvedi8ija6Tq5CqVcKbuo pmr1V8k1rSxoTacxdFLruDDxSknFxCPagg6k15OK1rQjegWFgx6P1SSQMQJ1uIu4Vo/F gIaTBlqMFZPpukjqplAVIsfA8Fjy39M206YzvFTOPeXerNK253x6prqH0mvNuPhJWPLB eEz3h54aAiieAh9xFa8hGd2HIAg//ksgL3etEuG09fM2J2DbDjP/OPszXomggf6jfC0w iycKjoovptje7Mnd3MbHw+DHhyI+Hp4tTbxN3Qvyuzw94/ZQBLa0JanakuV1bv22cuKl hefA== X-Gm-Message-State: AOAM533MBPU07dQ0osLcrxBlJiAd/1GpLqXYVZ9YpYqw0MSMOtIYxtrb A/pT3aR7EgE9MYJi8OIu8d0W3w== X-Google-Smtp-Source: ABdhPJz+E+znnq6FEjdPOkRnvJIJuhDgPX7nroYyxTVXggMZrz7ofPgCiuw7GL6R4vnZUX0nH1QALw== X-Received: by 2002:a05:6808:1644:b0:2ef:b05:1cdc with SMTP id az4-20020a056808164400b002ef0b051cdcmr4910578oib.66.1653046075797; Fri, 20 May 2022 04:27:55 -0700 (PDT) Received: from ?IPV6:2804:431:c7cb:cdd6:1223:d9e4:2076:bfdf? ([2804:431:c7cb:cdd6:1223:d9e4:2076:bfdf]) by smtp.gmail.com with ESMTPSA id n24-20020a4ae758000000b0035eb4e5a6b1sm914212oov.7.2022.05.20.04.27.54 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 20 May 2022 04:27:55 -0700 (PDT) Message-ID: Date: Fri, 20 May 2022 08:27:53 -0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.0 Subject: Re: [PATCH] dlsym: Make RTLD_NEXT prefer default version definition [#BZ #14932] Content-Language: en-US To: Fangrui Song , libc-alpha@sourceware.org, Florian Weimer References: <20220520083507.2368165-1-maskray@google.com> From: Adhemerval Zanella In-Reply-To: <20220520083507.2368165-1-maskray@google.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-13.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, NICE_REPLY_A, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE 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-List-Received-Date: Fri, 20 May 2022 11:27:58 -0000 On 20/05/2022 05:35, Fangrui Song via Libc-alpha wrote: > When the first object providing foo defines both foo@v1 and foo@@v2, > dlsym(RTLD_NEXT, "foo") returns foo@v1 while dlsym(RTLD_DEFAULT, "foo") > returns foo@@v2. The issue is that RTLD_DEFAULT use the > DL_LOOKUP_RETURN_NEWEST flag while RTLD_NEXT doesn't. Fix the RTLD_NEXT > branch to use DL_LOOKUP_RETURN_NEWEST. I am afraid we will need to add a compat dlsym for this change. > --- > elf/Makefile | 7 +++++++ > elf/dl-sym.c | 2 +- > elf/nextmod3.c | 19 +++++++++++++++++++ > elf/nextmod3.map | 3 +++ > elf/tst-next-ver.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 76 insertions(+), 1 deletion(-) > create mode 100644 elf/nextmod3.c > create mode 100644 elf/nextmod3.map > create mode 100644 elf/tst-next-ver.c > > diff --git a/elf/Makefile b/elf/Makefile > index 6f4ea78007..6cc0023364 100644 > --- a/elf/Makefile > +++ b/elf/Makefile > @@ -425,6 +425,7 @@ tests += \ > tst-initorder2 \ > tst-latepthread \ > tst-main1 \ > + tst-next-ver \ > tst-nodelete2 \ > tst-nodelete-dlclose \ > tst-nodelete-opened \ > @@ -711,6 +712,7 @@ modules-names += \ > neededobj6 \ > nextmod1 \ > nextmod2 \ > + nextmod3 \ > nodel2mod1 \ > nodel2mod2 \ > nodel2mod3 \ > @@ -1689,6 +1691,9 @@ $(objpfx)reldep4.out: $(objpfx)reldep4mod1.so $(objpfx)reldep4mod2.so > $(objpfx)next: $(objpfx)nextmod1.so $(objpfx)nextmod2.so > LDFLAGS-next = -Wl,--no-as-needed > > +$(objpfx)tst-next-ver: $(objpfx)nextmod3.so > +LDFLAGS-tst-next-ver = -Wl,--no-as-needed > + > $(objpfx)unload2.out: $(objpfx)unload2mod.so $(objpfx)unload2dep.so > > $(objpfx)lateglobal.out: $(objpfx)ltglobmod1.so $(objpfx)ltglobmod2.so > @@ -2436,6 +2441,8 @@ $(objpfx)tst-linkall-static: \ > endif > endif > > +LDFLAGS-nextmod3.so = -Wl,--version-script=nextmod3.map > + > # The application depends on the DSO, and the DSO loads the plugin. > # The plugin also depends on the DSO. This creates the circular > # dependency via dlopen that we're testing to make sure works. > diff --git a/elf/dl-sym.c b/elf/dl-sym.c > index aa993942df..b1cf42f36d 100644 > --- a/elf/dl-sym.c > +++ b/elf/dl-sym.c > @@ -144,7 +144,7 @@ RTLD_NEXT used in code not dynamically loaded")); > l = l->l_loader; > > result = GLRO(dl_lookup_symbol_x) (name, match, &ref, l->l_local_scope, > - vers, 0, 0, match); > + vers, 0, flags, match); > } > else > { > diff --git a/elf/nextmod3.c b/elf/nextmod3.c > new file mode 100644 > index 0000000000..96608a65c0 > --- /dev/null > +++ b/elf/nextmod3.c > @@ -0,0 +1,19 @@ > +int > +foo_v1 (int a) > +{ > + return 1; > +} > +asm (".symver foo_v1, foo@v1"); > + > +int > +foo_v2 (int a) > +{ > + return 2; > +} > +asm (".symver foo_v2, foo@v2"); > + > +int > +foo (int a) > +{ > + return 3; > +} > diff --git a/elf/nextmod3.map b/elf/nextmod3.map > new file mode 100644 > index 0000000000..0a8e4e4ee3 > --- /dev/null > +++ b/elf/nextmod3.map > @@ -0,0 +1,3 @@ > +v1 { }; > +v2 { }; > +v3 { foo; }; > diff --git a/elf/tst-next-ver.c b/elf/tst-next-ver.c > new file mode 100644 > index 0000000000..7241f9038b > --- /dev/null > +++ b/elf/tst-next-ver.c > @@ -0,0 +1,46 @@ > +/* Test RTLD_DEFAULT/RTLD_NEXT when the definition has multiple versions. > + Copyright (C) 2018-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 "testobj.h" > + > +static int > +do_test (void) > +{ > + /* Resolve to foo@@v3 in nextmod3.so, instead of > + foo@v1 or foo@v2. */ > + int (*fp) (int) = dlsym (RTLD_DEFAULT, "foo"); > + int res = fp (0); > + printf ("preload (0) = %d, %s\n", res, res == 3 ? "ok" : "wrong"); > + if (res != 3) > + return 1; > + > + /* Resolve to foo@@v3 in nextmod3.so, instead of > + foo@v1 or foo@v2. */ > + fp = dlsym (RTLD_NEXT, "foo"); > + res = fp (0); > + printf ("preload (0) = %d, %s\n", res, res == 3 ? "ok" : "wrong"); > + if (res != 3) > + return 1; > + > + return 0; > +} > + > +#include