From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ot1-x334.google.com (mail-ot1-x334.google.com [IPv6:2607:f8b0:4864:20::334]) by sourceware.org (Postfix) with ESMTPS id CA15C385700A for ; Thu, 14 Jan 2021 15:40:01 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org CA15C385700A Received: by mail-ot1-x334.google.com with SMTP id w3so5499532otp.13 for ; Thu, 14 Jan 2021 07:40:01 -0800 (PST) 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; bh=JrrwUDAsUywTI2pVMTd2JXK/0ILyb33Rt8pnUQfYG1k=; b=kOxTjR3pHsx1Kcq4hD5ioYg8yWnA13PzIvtMJHYxFvqw1Yl5YuqUB2NOm7bSpiYPJ4 3GrHOAP8lX7lM6IdMTk/6UExA3fo2c6BB2k7H1HiIfyKgE1QvFlsI6y0OXUjtdFrExks BNBhdnbIvwfn+yxq+ni+yDuY+JAmhQM02ST6x8JVtyGUWWnMhltkoSx3bs7DrkL2kV9S 04kRQl0nVAUvC0Be05nZ1NYjNYqmd9JiMpJGbOG2P0DwM/BnY98LPmjiysmHxTi00jgE NhAhKvbf9M3ggU83dhWO9/vf5zQu+Q59o2f9wbyYn8cqI+1JykZOduucQKJX4ltJOHnr E0mA== X-Gm-Message-State: AOAM530hm5gnCg8CSZsji9BuFO7VwPw2/NNL/BH4u1ULDSfTuzSf6pX5 2a/gdn2+vJA9UMpBkt4ByaXFv8CJl3rXX24q5jU= X-Google-Smtp-Source: ABdhPJyxCAYa5XPkJos1/Ahg3YC8adxaZU9ncgozi+4IwkUOzkGvIfcyP1sQwDKVI3Yn+AUBZMxDH0qlERIgYs1OE/I= X-Received: by 2002:a05:6830:10d2:: with SMTP id z18mr5006645oto.90.1610638801170; Thu, 14 Jan 2021 07:40:01 -0800 (PST) MIME-Version: 1.0 References: <27498bbc768372541e4379794656ac2778d33035.1610471272.git.szabolcs.nagy@arm.com> <20210113095053.GA2379@arm.com> <20210114111757.GA11466@arm.com> In-Reply-To: <20210114111757.GA11466@arm.com> From: "H.J. Lu" Date: Thu, 14 Jan 2021 07:39:25 -0800 Message-ID: Subject: Re: [PATCH v3 2/5] Make libc symbols hidden in static PIE To: Szabolcs Nagy Cc: GNU C Library Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-3036.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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: Thu, 14 Jan 2021 15:40:03 -0000 On Thu, Jan 14, 2021 at 3:18 AM Szabolcs Nagy wrote: > > The 01/13/2021 09:50, Szabolcs Nagy via Libc-alpha wrote: > > The 01/12/2021 17:19, H.J. Lu wrote: > > > On Tue, Jan 12, 2021 at 4:33 PM H.J. Lu wrote: > > > > On Tue, Jan 12, 2021 at 4:02 PM H.J. Lu wrote: > > > > > See: > > > > > > > > > > https://sourceware.org/bugzilla/show_bug.cgi?id=14961 > > > > > > > > > /* Mark all symbols hidden in static PIE libc to avoid GOT indirections. */ > > > > -#if BUILD_PIE_DEFAULT && IS_IN (libc) && !defined LIBC_NONSHARED > > > > +#if BUILD_PIE_DEFAULT && !defined NO_HIDDEN_EXTERN_FUNC_IN_PIE \ > > > > + && IS_IN (libc) && !defined LIBC_NONSHARED > > > > # pragma GCC visibility push(hidden) > > > > #endif > > > > > > > > > > This works on i686. > > The series i plan to commit today is in nsz/bug27072 now, > > This is the v4 of this patch: > > Hidden matters with static PIE: extern symbol access in position > independent code usually involves GOT indirections which needs > RELATIVE relocs in a static linked PIE. Hidden visibility avoids > indirections and RELATIVE relocs on targets that can access symbols > pc-relative. > > The check should use IS_IN_LIB instead of IS_IN(libc) since all > static libraries can use hidden visibility to avoid indirections, > however the test system links objects from libcrypt.a into dynamic > linked test binaries so hidden does not work there. I think mixing > static and shared libc components in the same binary should not be > supported usage, but to be safe only use hidden in libc.a. > > There are targets (i686) where hidden visibility functions are > problematic in PIE code so hidden cannot be applied to all symbols. > Then static PIE requires extern object access without relocations > (e.g. by relying on copy relocations in shared libraries instead of > GOT access in PIE code). See bug 14961. > > From -static-pie linked 'int main(){}' this shaves off 73 relative > relocs on aarch64 and reduces code size too. > --- > include/libc-symbols.h | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > diff --git a/include/libc-symbols.h b/include/libc-symbols.h > index ea126ae70c..f4dd735555 100644 > --- a/include/libc-symbols.h > +++ b/include/libc-symbols.h > @@ -434,13 +434,18 @@ for linking") > strong_alias(real, name) > #endif > > -#if defined SHARED || defined LIBC_NONSHARED \ > - || (BUILD_PIE_DEFAULT && IS_IN (libc)) > +#if defined SHARED || defined LIBC_NONSHARED > # define attribute_hidden __attribute__ ((visibility ("hidden"))) > #else > # define attribute_hidden > #endif > > +/* Mark all symbols hidden in static PIE libc to avoid GOT indirections. */ > +#if BUILD_PIE_DEFAULT && !defined NO_HIDDEN_EXTERN_FUNC_IN_PIE \ > + && IS_IN (libc) && !defined LIBC_NONSHARED > +# pragma GCC visibility push(hidden) > +#endif > + > #define attribute_tls_model_ie __attribute__ ((tls_model ("initial-exec"))) > > #define attribute_relro __attribute__ ((section (".data.rel.ro"))) > -- > 2.17.1 > This generates bad static PIE on i386. This patch is needed: diff --git a/include/libc-symbols.h b/include/libc-symbols.h index f4dd735555..72276a5c48 100644 --- a/include/libc-symbols.h +++ b/include/libc-symbols.h @@ -434,7 +434,9 @@ for linking") strong_alias(real, name) #endif -#if defined SHARED || defined LIBC_NONSHARED +#if defined SHARED || defined LIBC_NONSHARED \ + || !defined NO_HIDDEN_EXTERN_FUNC_IN_PIE \ + || (BUILD_PIE_DEFAULT && IS_IN (libc)) # define attribute_hidden __attribute__ ((visibility ("hidden"))) #else # define attribute_hidden -- H.J.