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: AS22989 209.51.188.0/24 X-Spam-Status: No, score=-3.6 required=3.0 tests=AWL,BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED, FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL,SPF_HELO_PASS,SPF_PASS shortcircuit=no autolearn=unavailable autolearn_force=no version=3.4.2 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id 6DBC61F5AE for ; Wed, 28 Apr 2021 02:11:42 +0000 (UTC) Received: from localhost ([::1]:38660 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lbZfw-0007H4-TO for normalperson@yhbt.net; Tue, 27 Apr 2021 22:11:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:39026) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lbZft-0007Gk-0Y for bug-gnulib@gnu.org; Tue, 27 Apr 2021 22:11:37 -0400 Received: from mail-oi1-x22c.google.com ([2607:f8b0:4864:20::22c]:38649) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lbZfr-0001XX-29 for bug-gnulib@gnu.org; Tue, 27 Apr 2021 22:11:36 -0400 Received: by mail-oi1-x22c.google.com with SMTP id d25so24096920oij.5 for ; Tue, 27 Apr 2021 19:11:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=wfFB9Pqx2CKjJY2qKtKhCcFSEXwvg+lpOzO5M3BYg54=; b=rdUBX9/BNJaN7ZvGQgDJq5lt+N3DB53Be+ssYKotVM9RgXCuWrZruu9WC3ASN28fwM q1oQJSIu7RIAJlks1e4eTBp1S/kE0fZ4jFVaA1cE4MZTqI3jXRhV/sD7jR9D20oDNkUA vSuf8pTCYr+GCEvO79yle3cZUzJwnsN6BTwqb3sho9FZ0HPsZy5lBUT9zcJqFqSt3KxB 5qXJgXjCw802fOQRaS2svvfSz/ZpGSM6ypb6Vrf5AyyvUi/tC96EEh198W2/9k0Vi8dm vcf3wFui8SBOE42RW+KaiIPsOE8eHEF1KGGRRj+AfZo4dPPsmpfC8dpU+MHieD8/nkM9 LBFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=wfFB9Pqx2CKjJY2qKtKhCcFSEXwvg+lpOzO5M3BYg54=; b=KwGVyVEnSExFB6wBOlvxXT2Avqzk/tAU3YFzbmUTOsy4zg24qqT3ygyiNeOtRdmnfh HwzRvojuCBNV69cuzN1vehfF9dx5BFSjEKMWFJS/pwMuEIqvOXxCFDDj3AJkb/sw8/EX fwjA2ADBmY8eb0ltrj5L2I0UhKsLZC4wwZdljoBG8JYStgZNPANJaVtngBHlC2Y2Z7xu mbEC+OlEodvkYkX2AvMWbCNZPppnMU7Cp1ArjJ2eadtRVHTfqOIFTFRtxOYOHtMtX6KX QvykgFeRMf8NRiasYJKei7RwkUFtcLKcqqh7F4uzaXeOsBsUBoFVKM7CShvCmxZMm7dQ jsQw== X-Gm-Message-State: AOAM533RCQ55JkcjobuSmQIg9nMqIFSOEBLxrbwqTJnykIoCdDKrvlDu L6yyp2+5D2fPAaDwHs4joZZd69vmQJYNKVyKOh8= X-Google-Smtp-Source: ABdhPJygjdhIIJBjS0t+ym/sUbLDJzdsll1uH6MEI9am784tklT7zJ0YB0W5jcQJzsBepq9eN3vufQS5FZt7V4sCRpU= X-Received: by 2002:a05:6808:2d0:: with SMTP id a16mr9937900oid.116.1619575892526; Tue, 27 Apr 2021 19:11:32 -0700 (PDT) MIME-Version: 1.0 References: <87o8e0p92r.fsf@oldenburg.str.redhat.com> <87fszc8a1z.fsf@igel.home> <87eeewnfzw.fsf@oldenburg.str.redhat.com> <1680226.UWtE2gOZdF@omega> In-Reply-To: <1680226.UWtE2gOZdF@omega> From: "H.J. Lu" Date: Tue, 27 Apr 2021 19:10:56 -0700 Message-ID: Subject: Re: Undefined use of weak symbols in gnulib To: Bruno Haible Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass client-ip=2607:f8b0:4864:20::22c; envelope-from=hjl.tools@gmail.com; helo=mail-oi1-x22c.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: bug-gnulib@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Gnulib discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Florian Weimer , GNU C Library , Andreas Schwab , bug-gnulib@gnu.org, Binutils Errors-To: bug-gnulib-bounces+normalperson=yhbt.net@gnu.org Sender: "bug-gnulib" On Tue, Apr 27, 2021 at 6:57 PM Bruno Haible wrote: > > Hi Florian, > > > Here's a fairly representative test case, I think. > > > > #include > > #include > > > > extern __typeof (pthread_key_create) __pthread_key_create __attribute__= ((weak)); > > extern __typeof (pthread_once) pthread_once __attribute__ ((weak)); > > > > void > > f1 (void) > > { > > puts ("f1 called"); > > } > > > > pthread_once_t once_var; > > > > void __attribute__ ((weak)) > > f2 (void) > > { > > if (__pthread_key_create !=3D NULL) > > pthread_once (&once_var, f1); > > } > > > > int > > main (void) > > { > > f2 (); > > } > > > > Building it with =E2=80=9Cgcc -O2 -fpie -pie=E2=80=9D and linking with = binutils 2.30 > > does not result in a crash with LD_PRELOAD=3Dlibpthread.so.0. > > Thank you for the test case. It helps the understanding. > > But I don't understand > - why anyone would redeclare 'pthread_once', when it's a standard POSIX > function, > - why f2 is declared weak, > - why the program skips its initializations in single-threaded mode, > - why libpthread would be loaded through LD_PRELOAD or dlopen, given > that the long-term statement has been that declaring a symbol weak > has no effect on the dynamic linker [1][2][3][4]? > > How about the following test case instead? > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > #include > #include > > #pragma weak pthread_key_create > #pragma weak pthread_once > > void > do_init (void) > { > puts ("initialization code"); > } > > pthread_once_t once_var; > > void > init (void) > { > if (pthread_key_create !=3D NULL) > { > puts ("multi-threaded initialization"); > pthread_once (&once_var, do_init); > } > else > do_init (); > } > > int > main (void) > { > init (); > } > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > $ gcc -Wall -fpie -pie foo.c ; ./a.out > initialization code > > $ gcc -Wall -fpie -pie foo.c -Wl,--no-as-needed -lpthread ; ./a.out > multi-threaded initialization > initialization code > > What will change for this program with glibc 2.34? > > Bruno > > [1] https://sourceware.org/legacy-ml/libc-hacker/2000-06/msg00029.html > [2] https://www.akkadia.org/drepper/dsohowto.pdf page 6 > [3] https://stackoverflow.com/questions/21092601/is-pthread-in-glibc-so-i= mplemented-by-weak-symbol-to-provide-pthread-stub-functi/21103255 > [4] https://stackoverflow.com/questions/20658809/dynamic-loading-and-weak= -symbol-resolution > Does x86 show the same issue? I fixed several undefined weak symbol bugs on x86: https://sourceware.org/bugzilla/show_bug.cgi?id=3D19636 https://sourceware.org/bugzilla/show_bug.cgi?id=3D19704 https://sourceware.org/bugzilla/show_bug.cgi?id=3D19719 with a linker option: 'dynamic-undefined-weak' 'nodynamic-undefined-weak' Make undefined weak symbols dynamic when building a dynamic object, if they are referenced from a regular object file and not forced local by symbol visibility or versioning. Do not make them dynamic if 'nodynamic-undefined-weak'. If neither option is given, a target may default to either option being in force, or make some other selection of undefined weak symbols dynamic. Not all targets support these options. Alan extended the fix to PPC: commit 954b63d4c8645f86e40c7ef6c6d60acd2bf019de Author: Alan Modra Date: Wed Apr 19 01:26:57 2017 +0930 Implement -z dynamic-undefined-weak -z nodynamic-undefined-weak is only implemented for x86. (The sparc backend has some support code but doesn't enable the option by including ld/emulparams/dynamic_undefined_weak.sh, and since the support looks like it may be broken I haven't enabled it.) This patch adds the complementary -z dynamic-undefined-weak, extends both options to affect building of shared libraries as well as executables, and adds support for the option on powerpc. --=20 H.J.