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, 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 D86A91F8C6 for ; Thu, 5 Aug 2021 16:42:48 +0000 (UTC) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id E06D93992C8A for ; Thu, 5 Aug 2021 16:42:47 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E06D93992C8A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1628181767; bh=pbnHxEZ027u50TDns4ErTZxUkyBLm/1mkNo3MxztfEM=; h=References:In-Reply-To:Date:Subject:To:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=o6u1OQEWnFQ1U5i+xkApq+75ezIfKew1ekRvfXIWiePKYxxBtAqnGI7f38xgToYye 2OLxBtjlzbSvZ2ykZ9IWe9TRfJA5tX9zi7dVtbqV2xKeCwWDSc/PDivJCOrpKvzS0C CJMf5cc3hCR99hotclco2Bd2ndeyJOKEZNzvDXDU= Received: from mail-pj1-x102e.google.com (mail-pj1-x102e.google.com [IPv6:2607:f8b0:4864:20::102e]) by sourceware.org (Postfix) with ESMTPS id EEFA73969029 for ; Thu, 5 Aug 2021 16:34:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org EEFA73969029 Received: by mail-pj1-x102e.google.com with SMTP id ca5so10156324pjb.5 for ; Thu, 05 Aug 2021 09:34:49 -0700 (PDT) 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=pbnHxEZ027u50TDns4ErTZxUkyBLm/1mkNo3MxztfEM=; b=SsAdlfjCThv722rkf1aAmlobOsUkATTwbWm/ve3hrMYrHzl+4+r1AzxpqiBE+4jWCx w3hyhgrbPQESMVLEUghnS0saY+FLKYKsCy0z49smvXZb0ZUbgnZOnZifS+8TDEsTYaW8 zZp9QvkQ87NyWBhpIntrNYxKsp05OWd5pQRAC85YfkMtwpxm2GVameJWK7kaPQsvZLDo qDPQ+drjY42KaypqkXmuxrRrKG6H/QObEuexRibuO/seEqVbMAZyeMgSIuwouP1Gz1BM SQj0+5Z36iPxmSjgJy+TUc27buB1AxF9woF0jo0y0v+Gbr/Mw8ltfbSoKRHY2yIbonMo tT4g== X-Gm-Message-State: AOAM5321Lz75CFyQb+PHDVpoGZ7Tu6wvVBGvAdeKCoRDCyU5rfN64y3v HBZkN+gg3aEhf/WG/Mic9eOcFDG7GV50e8B6VgQ= X-Google-Smtp-Source: ABdhPJzZrAK9h6KyblPns6VkRt7uSDf+mgJvLjagfCLR/Bz4m1WUW7TnJVoDJ2zQYmuKfaK8RU6Ap574v4F4esEqbhY= X-Received: by 2002:a62:a109:0:b029:3c7:577c:9513 with SMTP id b9-20020a62a1090000b02903c7577c9513mr290916pff.57.1628181289072; Thu, 05 Aug 2021 09:34:49 -0700 (PDT) MIME-Version: 1.0 References: <20210805162601.1200851-1-maskray@google.com> <20210805162601.1200851-4-maskray@google.com> In-Reply-To: <20210805162601.1200851-4-maskray@google.com> Date: Thu, 5 Aug 2021 09:34:13 -0700 Message-ID: Subject: Re: [PATCH v2 3/3] configure: Allow LD to be LLD 13.0.0 or above [BZ #26558] To: Fangrui Song Content-Type: text/plain; charset="UTF-8" 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: "H.J. Lu via Libc-alpha" Reply-To: "H.J. Lu" Cc: GNU C Library Errors-To: libc-alpha-bounces+e=80x24.org@sourceware.org Sender: "Libc-alpha" On Thu, Aug 5, 2021 at 9:29 AM Fangrui Song via Libc-alpha wrote: > > When using LLD (LLVM linker) as the linker, configure prints a confusing > message. > > *** These critical programs are missing or too old: GNU ld > > LLD>=13.0.0 can build glibc --enable-static-pie. (8.0.0 needs one > workaround for -Wl,-defsym=_begin=0. 9.0.0 works with > --disable-static-pie). > > With BZ #28153 (glibc bug exposed by testing with LLD) fixed, > `make check` only has 2 more failures with LLD than with GNU ld: > BZ #28154 (LLD follows the PowerPC port of GNU ld for ifunc by > placing IRELATIVE relocations in .rela.dyn). This is an lld bug, similar to: https://sourceware.org/bugzilla/show_bug.cgi?id=13302 Please fix it at least on x86. > The set of dynamic symbols is the same with GNU ld and LLD, > modulo unused SHN_ABS version node symbols. > > For comparison, gold does not support --enable-static-pie > yet (--no-dynamic-linker is unsupported BZ #22221), yet > has 6 failures more than LLD. gold linked libc.so has > larger .dynsym differences with GNU ld and LLD > (ISTM non-default version symbols are changed to default versions > by a version script). > > --- > > I identified the lack of support of > > * version script on non-default version symbols > * copy relocations on non-default version symbols > > in an earlier snapshot of LLD 13.0.0 and fixed them. > The functionality of the LLD linked libc.so and ld.so looks pretty good. > --- > configure | 77 +++++++++++++++++++++++++++++++++++++++++++++++++--- > configure.ac | 20 ++++++++++---- > 2 files changed, 88 insertions(+), 9 deletions(-) > > diff --git a/configure b/configure > index 9b966196d4..050f1a29cf 100755 > --- a/configure > +++ b/configure > @@ -4664,9 +4664,10 @@ if test $ac_verc_fail = yes; then > fi > > > -if test -n "`$LD --version | sed -n 's/^GNU \(gold\).*$/\1/p'`"; then > +case $($LD --version) in > + "GNU gold"*) > # Accept gold 1.14 or higher > - for ac_prog in $LD > + for ac_prog in $LD > do > # Extract the first word of "$ac_prog", so it can be a program name with args. > set dummy $ac_prog; ac_word=$2 > @@ -4729,8 +4730,75 @@ if test $ac_verc_fail = yes; then > LD=: critic_missing="$critic_missing GNU gold" > fi > > + ;; > + "LLD"*) > + # Accept LLD 13.0.0 or higher > + for ac_prog in $LD > +do > + # Extract the first word of "$ac_prog", so it can be a program name with args. > +set dummy $ac_prog; ac_word=$2 > +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 > +$as_echo_n "checking for $ac_word... " >&6; } > +if ${ac_cv_prog_LD+:} false; then : > + $as_echo_n "(cached) " >&6 > else > - for ac_prog in $LD > + if test -n "$LD"; then > + ac_cv_prog_LD="$LD" # Let the user override the test. > +else > +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR > +for as_dir in $PATH > +do > + IFS=$as_save_IFS > + test -z "$as_dir" && as_dir=. > + for ac_exec_ext in '' $ac_executable_extensions; do > + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then > + ac_cv_prog_LD="$ac_prog" > + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 > + break 2 > + fi > +done > + done > +IFS=$as_save_IFS > + > +fi > +fi > +LD=$ac_cv_prog_LD > +if test -n "$LD"; then > + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 > +$as_echo "$LD" >&6; } > +else > + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 > +$as_echo "no" >&6; } > +fi > + > + > + test -n "$LD" && break > +done > + > +if test -z "$LD"; then > + ac_verc_fail=yes > +else > + # Found it, now check the version. > + { $as_echo "$as_me:${as_lineno-$LINENO}: checking version of $LD" >&5 > +$as_echo_n "checking version of $LD... " >&6; } > + ac_prog_version=`$LD --version 2>&1 | sed -n 's/^.*LLD.* \([0-9][0-9]*\.[0-9.]*\).*$/\1/p'` > + case $ac_prog_version in > + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; > + 1[3-9].*|[2-9][0-9].*) > + ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; > + *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; > + > + esac > + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5 > +$as_echo "$ac_prog_version" >&6; } > +fi > +if test $ac_verc_fail = yes; then > + LD=: critic_missing="$critic_missing LLD" > +fi > + > + ;; > + *) > + for ac_prog in $LD > do > # Extract the first word of "$ac_prog", so it can be a program name with args. > set dummy $ac_prog; ac_word=$2 > @@ -4793,7 +4861,8 @@ if test $ac_verc_fail = yes; then > LD=: critic_missing="$critic_missing GNU ld" > fi > > -fi > + ;; > +esac > > # These programs are version sensitive. > for ac_prog in gnumake gmake make > diff --git a/configure.ac b/configure.ac > index 17a4c9a1ab..5632277f9c 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -995,18 +995,28 @@ AC_CHECK_PROG_VER(AS, $AS, --version, > [2.1[0-9][0-9]*|2.2[5-9]*|2.[3-9][0-9]*|[3-9].*|[1-9][0-9]*], > AS=: critic_missing="$critic_missing as") > > -if test -n "`$LD --version | sed -n 's/^GNU \(gold\).*$/\1/p'`"; then > +case $($LD --version) in > + "GNU gold"*) > # Accept gold 1.14 or higher > - AC_CHECK_PROG_VER(LD, $LD, --version, > + AC_CHECK_PROG_VER(LD, $LD, --version, > [GNU gold.* \([0-9][0-9]*\.[0-9.]*\)], > [1.1[4-9]*|1.[2-9][0-9]*|1.1[0-9][0-9]*|[2-9].*|[1-9][0-9]*], > LD=: critic_missing="$critic_missing GNU gold") > -else > - AC_CHECK_PROG_VER(LD, $LD, --version, > + ;; > + "LLD"*) > + # Accept LLD 13.0.0 or higher > + AC_CHECK_PROG_VER(LD, $LD, --version, > + [LLD.* \([0-9][0-9]*\.[0-9.]*\)], > + [1[3-9].*|[2-9][0-9].*], > + LD=: critic_missing="$critic_missing LLD") > + ;; > + *) > + AC_CHECK_PROG_VER(LD, $LD, --version, > [GNU ld.* \([0-9][0-9]*\.[0-9.]*\)], > [2.1[0-9][0-9]*|2.2[5-9]*|2.[3-9][0-9]*|[3-9].*|[1-9][0-9]*], > LD=: critic_missing="$critic_missing GNU ld") > -fi > + ;; > +esac > > # These programs are version sensitive. > AC_CHECK_PROG_VER(MAKE, gnumake gmake make, --version, > -- > 2.32.0.605.g8dce9f2422-goog > -- H.J.