From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS3215 2.6.0.0/16 X-Spam-Status: No, score=-3.3 required=3.0 tests=AWL,BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,MAILING_LIST_MULTI,NICE_REPLY_A, RCVD_IN_DNSWL_MED,SPF_HELO_PASS,SPF_PASS,URIBL_BLACK shortcircuit=no autolearn=no autolearn_force=no version=3.4.2 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 RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id 3C0781F5AE for ; Tue, 4 May 2021 21:28:22 +0000 (UTC) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 6CAAA385E00D; Tue, 4 May 2021 21:28:21 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 6CAAA385E00D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1620163701; bh=n45aSXOd3TQDmwboySjN5XLjcslVKIe7pInWBqFJALs=; h=Subject:To:References:Date:In-Reply-To:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=QJl3P1zoxoJ7PqViGYGjEYNC2ay7YsY+YJvSAe8x8/gdRApbdGeFuoHBdQ5wbtHym gge/DSeO5v/gOVryUTITAM4DqgXWvHdrT4q8VH4j1CifpGcfVJU5Dpfelf06b+Xi/9 guzR2XJUgWXY8vEFqH/01eZAJwJnpOe6yRL7krcs= Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by sourceware.org (Postfix) with ESMTP id BF993385E00D for ; Tue, 4 May 2021 21:28:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org BF993385E00D Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-23-4AQaNziXOXOQQ27Or39Ycw-1; Tue, 04 May 2021 17:28:14 -0400 X-MC-Unique: 4AQaNziXOXOQQ27Or39Ycw-1 Received: by mail-qk1-f197.google.com with SMTP id e4-20020a37b5040000b02902df9a0070efso8494623qkf.18 for ; Tue, 04 May 2021 14:28:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:organization :message-id:date:user-agent:mime-version:in-reply-to :content-language:content-transfer-encoding; bh=n45aSXOd3TQDmwboySjN5XLjcslVKIe7pInWBqFJALs=; b=Z+PvFKGX9tD648xhZEWePpVcEWaUvxy8QlqlkMW/tQA2sKZ7P3sIyBr4pO1Tm79+rA RFQldCWTUY/3UDJTIHHn7jfwwCIizBaaFpzD6Kp5KhwdFgydR3g7pdyVD1NO3mRiEIEo tiasaI9ISNaoY2NRKAeV1CDW3eg3T4JqLzFUe5XKRm+s6KzyIbP8vimOJDj9bjfX/v0k FL09J2mlqO/oZ7T/p1xUPsTLKwllYZN4oNk3bOBgH9zfg/RRupPa/ydjKCLGz5VSFcVE tyzyQ4soeMq0eBs34VlQeKcpLb7MMeGL3bBRLIdFW/k0Pw+Wt4ugRP5YfyaA6CCb8GJe gOEg== X-Gm-Message-State: AOAM533afp2j34Q6r0Asp6XpehpWApuaEZgrEXsQ6NImMJPHEfpL+jhI sUnR7gb3rGg6PaAeAhsZrWFeUq7kdvawBEsBbrVtF6omYTs+YfxXycBktQ0Q/5oHFEYjyGGIYiK eaLEVJczxHYll3w3VdagL X-Received: by 2002:ae9:e717:: with SMTP id m23mr6955744qka.205.1620163693077; Tue, 04 May 2021 14:28:13 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzEz/n4QlhSGruHLMj+z48sSTemlMj6YMRuR7fXTaaviGpm/cqOWzx8/MR3pprwGG8EohA7xg== X-Received: by 2002:ae9:e717:: with SMTP id m23mr6955720qka.205.1620163692683; Tue, 04 May 2021 14:28:12 -0700 (PDT) Received: from [192.168.1.16] (198-84-214-74.cpe.teksavvy.com. [198.84.214.74]) by smtp.gmail.com with ESMTPSA id u126sm12443007qkd.80.2021.05.04.14.28.11 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 04 May 2021 14:28:12 -0700 (PDT) Subject: Re: [RFC] elf: Implement filtering of symbols historically defined in libpthread To: Florian Weimer , libc-alpha@sourceware.org References: <87h7jqguew.fsf@oldenburg.str.redhat.com> Organization: Red Hat Message-ID: <0662ac47-3d09-8309-a679-69cae2133cd8@redhat.com> Date: Tue, 4 May 2021 17:28:10 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.8.1 MIME-Version: 1.0 In-Reply-To: <87h7jqguew.fsf@oldenburg.str.redhat.com> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit 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: Carlos O'Donell via Libc-alpha Reply-To: Carlos O'Donell Cc: Andreas Schwab Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" On 4/28/21 2:01 PM, Florian Weimer via Libc-alpha wrote: > Definitions of these symbols in libc expose bugs in existing binaries > linked against earlier glibc versions. Therefore, hide these symbols > for old binaries. Overall this looks good to me. (1) High level approach is good. I like that this is not on the hot path, and called open for weak unversioned symbol references via check_match(), and I think as approaches go this is light and fast. (2) Other solutions to the problem. I don't see any other simple solutions to the effectively underlinked binary that finds libphread loaded with libc. I like that we can contain the solution within libc itself without needing to do any preloading. > The symbol list in sysdeps/nptl/dl-pthread-weak.c contains some > symbols which have not been moved yet, but that is harmless because > the function is only invoked if the symbol is found in libc.so. > > The test suite passes on i686-gnu-linux, powerpc64-linux-gnu, > x86_64-linux-gnu with these changes. > > Is this the direction we want to go in? Then I'm going to add test > cases, probably using assembler. > > Personally I think it's not *too* bad, also not particularly nice > either. elf/dl-pthread-weak.os brings in 2-3 KiB of code (but few > run-time relocations). One possibility I have not mentioned in the > comment is to put the moved symbols into a GLIBCPTHREAD_2.34 symbol > version and use the presence of this version on the chain as an > indicator that the symbol uses special treatment. This eliminates the > separate string table. The downside is that we cannot easily add more > symbols if we discover some are missing. This happened to me during > development with pthread_mutexattr_gettype, which is a GLIBC_2.1 symbol > and therefore not actually suitable for detecting the presence of > libpthread (historically speaking). And it could happen again with > thrd_exit (which is of course much younger). (3) Keep it flexible. I think we need to keep the flexibility of the table lookup and avoid adding more versioned symbols. > --- > elf/Makefile | 2 +- > elf/dl-lookup.c | 13 +++- > elf/dl-open.c | 3 + > elf/dl-pthread-weak.c | 20 +++++ > elf/dl-version.c | 2 + > sysdeps/generic/dl-pthread-weak.h | 67 +++++++++++++++++ > sysdeps/nptl/dl-pthread-weak.c | 153 ++++++++++++++++++++++++++++++++++++++ > sysdeps/nptl/dl-pthread-weak.h | 107 ++++++++++++++++++++++++++ > 8 files changed, 363 insertions(+), 4 deletions(-) > > diff --git a/elf/Makefile b/elf/Makefile > index f09988f7d2..0dd430366f 100644 > --- a/elf/Makefile > +++ b/elf/Makefile > @@ -34,7 +34,7 @@ dl-routines = $(addprefix dl-,load lookup object reloc deps \ > version profile tls origin scope \ > execstack open close trampoline \ > exception sort-maps lookup-direct \ > - call-libc-early-init write \ > + call-libc-early-init write pthread-weak \ OK. Add pthread-weak. > thread_gscope_wait tls_init_tp) > ifeq (yes,$(use-ldconfig)) > dl-routines += dl-cache > diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c > index eea217eb28..2a2b46f85c 100644 > --- a/elf/dl-lookup.c > +++ b/elf/dl-lookup.c > @@ -29,6 +29,7 @@ > #include > #include > #include > +#include OK. Include during lookup. > > #include > > @@ -64,6 +65,7 @@ check_match (const char *const undef_name, > const Elf_Symndx symidx, > const char *const strtab, > const struct link_map *const map, > + const struct link_map *undef_map, OK. Pass new argument to check_match. > const ElfW(Sym) **const versioned_sym, > int *const num_versions) > { > @@ -142,6 +144,11 @@ check_match (const char *const undef_name, > public interface should be returned. */ > if (verstab != NULL) > { > + /* Check if this is a legacy pthread weak symbol reference. > + If yes, then do not bind to this symbol. */ > + if (dl_pthread_hide_symbol (undef_map, undef_name, ref, map)) > + return NULL; > + > if ((verstab[symidx] & 0x7fff) > >= ((flags & DL_LOOKUP_RETURN_NEWEST) ? 2 : 3)) > { > @@ -429,8 +436,8 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash, > symidx = ELF_MACHINE_HASH_SYMIDX (map, hasharr); > sym = check_match (undef_name, ref, version, flags, > type_class, &symtab[symidx], symidx, > - strtab, map, &versioned_sym, > - &num_versions); > + strtab, map, undef_map, > + &versioned_sym, &num_versions); OK. Pass recursively. > if (sym != NULL) > goto found_it; > } > @@ -454,7 +461,7 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash, > { > sym = check_match (undef_name, ref, version, flags, > type_class, &symtab[symidx], symidx, > - strtab, map, &versioned_sym, > + strtab, map, undef_map, &versioned_sym, > &num_versions); > if (sym != NULL) > goto found_it; > diff --git a/elf/dl-open.c b/elf/dl-open.c > index ab7aaa345e..4389159717 100644 > --- a/elf/dl-open.c > +++ b/elf/dl-open.c > @@ -35,6 +35,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -743,6 +744,8 @@ dl_open_worker (void *a) > on memory allocation failure. See bug 16134. */ > update_tls_slotinfo (new); > > + dl_pthread_record_dlopen (new); OK. Opening. > + > /* Notify the debugger all new objects have been relocated. */ > if (relocation_in_progress) > LIBC_PROBE (reloc_complete, 3, args->nsid, r, new); > diff --git a/elf/dl-pthread-weak.c b/elf/dl-pthread-weak.c > new file mode 100644 > index 0000000000..aff80d4177 > --- /dev/null > +++ b/elf/dl-pthread-weak.c > @@ -0,0 +1,20 @@ > +/* Weak references to symbols formerly in libpthread. Generic version. > + Copyright (C) 2021 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 > + . */ > + > +/* The generic version is a header-only implementation. */ > +#include > diff --git a/elf/dl-version.c b/elf/dl-version.c > index 914955c2a8..d4c3b24a76 100644 > --- a/elf/dl-version.c > +++ b/elf/dl-version.c > @@ -24,6 +24,7 @@ > #include > #include > #include <_itoa.h> > +#include > > #include > > @@ -220,6 +221,7 @@ _dl_check_map_versions (struct link_map *map, int verbose, int trace_mode) > strtab + aux->vna_name, > needed->l_real, verbose, > aux->vna_flags & VER_FLG_WEAK); > + dl_pthread_record_version (map, aux); > > /* Compare the version index. */ > if ((unsigned int) (aux->vna_other & 0x7fff) > ndx_high) > diff --git a/sysdeps/generic/dl-pthread-weak.h b/sysdeps/generic/dl-pthread-weak.h > new file mode 100644 > index 0000000000..109cb4264b > --- /dev/null > +++ b/sysdeps/generic/dl-pthread-weak.h > @@ -0,0 +1,67 @@ > +/* Weak references to symbols formerly in libpthread. Generic version. > + Copyright (C) 2021 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 > + . */ > + > +/* A lot of applications contain code like this: > + > + if (pthread_mutexattr_gettype != NULL) > + pthread_once (&once_control, initializer_function); > + > + pthread_mutexattr_gettype and pthread_once are declared as weak in > + the application. Traditionally, link editors apply various forms > + of relaxations to a call to a weak function symbol if the symbol is > + undefined at static link time. This eliminates the symbol > + reference, but the relevant code path cannot be executed anymore. > + Such code paths become active after symbols like > + pthread_mutexattr_gettype are moved into libc, so it is necessary > + to mask the existence of the symbol for old binaries. */ OK. Good comment. Agreed. > + > +#ifndef _DL_PTHREAD_WEAK_H > +#define _DL_PTHREAD_WEAK_H > + > +#include > +#include > +#include > + > +/* Returns true if check_match in elf/dl-lookup.c should not resolve > + the symbol. Called only if an unversioned symbol is about to be > + bound to a versioned symbol. */ > +static inline bool > +dl_pthread_hide_symbol (const struct link_map *undef_map, > + const char *undef_name, > + const ElfW(Sym) *undef_sym, > + const struct link_map *defining_map) > +{ > + return false; > +} > + > +/* Called during dlopen in the base namespace. This can be used to > + detect a reference to libpthread. */ > +static inline void > +dl_pthread_record_dlopen (const struct link_map *map) > +{ > +} > + > +/* Called for each needed version during symbol version information > + processing as part of dlopen. */ > +static inline void > +dl_pthread_record_version (const struct link_map *map, > + const ElfW(Vernaux) *aux) > +{ > +} > + > +#endif /* _DL_PTHREAD_WEAK_H */ > diff --git a/sysdeps/nptl/dl-pthread-weak.c b/sysdeps/nptl/dl-pthread-weak.c > new file mode 100644 > index 0000000000..ff32939253 > --- /dev/null > +++ b/sysdeps/nptl/dl-pthread-weak.c > @@ -0,0 +1,153 @@ > +/* Weak references to symbols formerly in libpthread. NPTL version. > + Copyright (C) 2021 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 > + > +#if DL_PTHREAD_WEAK_NEEDED > +bool _dl_pthread_weak_symbols; > + > +/* There are several ways to implement the check to identify the > + relevant symbols. For example, we could use the otherwise unused > + weak symbol status within libc.so. The set representation is > + reasonably small and fast. This function is called only for weak > + unversioned symbol references already found in libc.so, which is an > + unusual case and therefore not on the fast path for symbol > + lookup. */ OK. Agreed. > + > + > +/* Lexicographically ordered list of symbols originally at the > + GLIBC_2.0 and GLIBC_2.1 versions. Later symbols (including C11 > + symbols) will give false negatives on earlier glibc versions and > + are thus unsuitable for libpthread detection. Even GLIBC_2.1 is > + problematic in this regard, but actual binaries use > + pthread_mutexattr_gettype as the detector symbol. */ > +enum { maximum_length = 21 }; Clarify in comments that this is a non-NULL termianted array please and that you must not run strlen on these fields. > +static const char symbols[][maximum_length] = > + { > + "_cleanup_pop", > + "_cleanup_pop_restore", > + "_cleanup_push", > + "_cleanup_push_defer", > + "_getspecific", > + "_key_create", > + "_mutex_destroy", > + "_mutex_init", > + "_mutex_lock", > + "_mutex_trylock", > + "_mutex_unlock", > + "_mutexattr_destroy", > + "_mutexattr_init", > + "_mutexattr_settype", > + "_once", > + "_setspecific", > + "atfork", > + "attr_getguardsize", > + "attr_getstackaddr", > + "attr_getstacksize", > + "attr_setguardsize", > + "attr_setstackaddr", > + "attr_setstacksize", > + "cancel", > + "create", > + "detach", > + "getconcurrency", > + "getspecific", > + "join", > + "key_create", > + "key_delete", > + "kill", > + "kill_other_threads_np", > + "mutex_trylock", > + "mutexattr_destroy", > + "mutexattr_getkind_np", > + "mutexattr_gettype", > + "mutexattr_init", > + "mutexattr_setkind_np", > + "mutexattr_settype", > + "once", > + "rwlock_destroy", > + "rwlock_init", > + "rwlock_rdlock", > + "rwlock_tryrdlock", > + "rwlock_trywrlock", > + "rwlock_unlock", > + "rwlock_wrlock", > + "rwlockattr_destroy", > + "rwlockattr_getkind_np", > + "rwlockattr_getpshared", > + "rwlockattr_init", > + "rwlockattr_setkind_np", > + "rwlockattr_setpshared", > + "sem_destroy", > + "sem_getvalue", > + "sem_init", > + "sem_post", > + "sem_trywait", > + "sem_wait", > + "setconcurrency", > + "setspecific", > + "sigmask", > + "testcancel", > + }; > + > +static inline int > +compare (const void *a, const void *b) > +{ > + return strncmp (a, b, maximum_length); > +} > + > +bool > +_dl_pthread_hidden_symbol (const char *undef_name) > +{ > + /* Turn the __pthread and _pthread prefixes into a _ prefix. This > + allows us to use a single lookup table. (The difference between > + __pthread_mutex_lock and pthread_mutex_lock is significant, for > + example.) */ > + const char *key = NULL; > + if (strncmp (undef_name, "__pthread_", strlen ("__pthread_")) == 0) > + key = undef_name + strlen ("__pthread"); > + else if (strncmp (undef_name, "_pthread_", strlen ("_pthread_")) == 0) > + key = undef_name + strlen ("_pthread"); > + else if (strncmp (undef_name, "pthread_", strlen ("pthread_")) == 0) > + key = undef_name + strlen ("pthread_"); > + else if (strncmp (undef_name, "sem_", strlen ("sem_")) == 0) > + /* Do not remove the sem_ prefix. This would result in false > + matches for symbols such as pthread_sem_post, but no such > + symbols exist. */ > + key = undef_name; > + > + if (key == NULL || strlen (key) > maximum_length) > + /* The prefix of undef_name is not recognized, or the string is > + not in the table because it is too long. */ > + return false; > + > + if (bsearch (key, symbols, array_length (symbols), maximum_length, > + compare) != NULL) > + { > + if (__glibc_unlikely (GLRO (dl_debug_mask) & DL_DEBUG_BINDINGS)) > + _dl_debug_printf ("\ > +not binding legacy weak reference in main program to %s\n", > + undef_name); OK. Excellent use of _dl_debug_printf with DL_DEBUG_BINDINGS. > + return true; > + } > + > + return false; > +} > + > +#endif /* DL_PTHREAD_WEAK_NEEDED */ > diff --git a/sysdeps/nptl/dl-pthread-weak.h b/sysdeps/nptl/dl-pthread-weak.h > new file mode 100644 > index 0000000000..f252abcafe > --- /dev/null > +++ b/sysdeps/nptl/dl-pthread-weak.h > @@ -0,0 +1,107 @@ > +/* Weak references to symbols formerly in libpthread. NPTL version. > + Copyright (C) 2021 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 > +#if OTHER_SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_34) > + > +/* For context, refer to . */ > + > +# include > +# include > +# include > +# include > +# include > + > +/* The implementation file needs to be compiled. */ > +#define DL_PTHREAD_WEAK_NEEDED 1 > + > +/* If false, weak symbols to old libpthread-only functions are hidden > + from symbol resolution in the main program. Set to true if > + libpthread is loaded by the main program (via > + dl_pthread_record_dlopen), or if the main program references > + GLIBC_2.34 (via dl_pthread_record_version). */ > +extern bool _dl_pthread_weak_symbols attribute_hidden; > + > +/* Returns true if UNDEF_NAME refers to a libpthread symbol that is > + hidden (in case of certain weak symbol references from the main > + program). */ > +bool _dl_pthread_hidden_symbol (const char *undef_name) attribute_hidden; > + > +static inline bool > +dl_pthread_hide_symbol (const struct link_map *undef_map, > + const char *undef_name, > + const ElfW(Sym) *undef_sym, > + const struct link_map *defining_map) > +{ > + /* Check if symbol hiding has been disabled. */ > + if (_dl_pthread_weak_symbols) > + return false; > + > + /* Symbol hiding only applies to weak symbol references. */ > + if (undef_sym == NULL || ELFW(ST_BIND) (undef_sym->st_info) != STB_WEAK) > + return false; OK. > + > + /* Only symbols in the main map are potentially hidden. Shared > + objects are compiled as PIC and are not affected by link editor > + optimizations. This implies a check that we are in the base > + namespace. */ > + const struct link_map *main_map = GL (dl_ns)[LM_ID_BASE]._ns_loaded; > + if (undef_map != main_map) > + return false; > + > + /* Symbol hiding only applies to symbols in libc.so. */ > + if (defining_map != GL (dl_ns)[LM_ID_BASE].libc_map) > + return false; > + > + /* Delegate to the out-of-line name checking function. */ > + return _dl_pthread_hidden_symbol (undef_name); > +} > + > +static inline void > +dl_pthread_record_dlopen (const struct link_map *map) > +{ > + /* This assumes that our libpthread has soname (and still exists as > + a separate shared object). */ > + const char *strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]); > + if (map->l_info[DT_SONAME] != NULL > + && strcmp (strtab + map->l_info[DT_SONAME]->d_un.d_val, > + LIBPTHREAD_SO) == 0) > + _dl_pthread_weak_symbols = true; OK. > +} > + > +static inline void > +dl_pthread_record_version (const struct link_map *map, > + const ElfW(Vernaux) *aux) > +{ > + /* Only GLIBC_2.34 references from the main map disable weak symbol > + hiding. */ > + const struct link_map *main_map = GL (dl_ns)[LM_ID_BASE]._ns_loaded; > + if (map != main_map) > + return; > + > + const char *strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]); > + if (strcmp (strtab + aux->vna_name, "GLIBC_2.34") == 0) > + _dl_pthread_weak_symbols = true; OK. > +} > + > +#else > +/* For static build and glibc after 2.34, it is possible to use the > + no-op default version. */ > +# include > +# define DL_PTHREAD_WEAK_NEEDED 0 > +#endif > -- Cheers, Carlos.