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=-5.5 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 shortcircuit=no autolearn=ham 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 DDD471F8C8 for ; Thu, 7 Oct 2021 14:53:29 +0000 (UTC) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D4A683858001 for ; Thu, 7 Oct 2021 14:53:28 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D4A683858001 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1633618408; bh=yP392JsbTfo44yISkd2Fem+U4ITxyw3c29XtghbwkiQ=; h=Subject:To:References:Date:In-Reply-To:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=RGlXi5xQoLLcuLGyJs/nO7yXBKImFdepVkDLKc4AQsLoxKQkMLhXARtXSK/rCWwTm mDIJ1vxEY8cT9jK94Lhdm5uXtZGQmgW7p7yjGtzLQaGBvSXVA4Zv6TSb4ZqXYMQHxN Przn/GjiRF3LfuoIPTHXRxC43YySt3Asjwh3/FmU= Received: from mail-qk1-x733.google.com (mail-qk1-x733.google.com [IPv6:2607:f8b0:4864:20::733]) by sourceware.org (Postfix) with ESMTPS id 28594385840B for ; Thu, 7 Oct 2021 14:53:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 28594385840B Received: by mail-qk1-x733.google.com with SMTP id t63so1465439qkf.1 for ; Thu, 07 Oct 2021 07:53:09 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=yP392JsbTfo44yISkd2Fem+U4ITxyw3c29XtghbwkiQ=; b=Ey6E2EdE57mfmh6VOEvbdE3OfCQZKKhnMbpSjlZuFC0BYgPZfAqCbEa8a/LBU3yM1j hznJpO8gpDYxMddZPHlTMW0mmOvDG8KazLdA8GaPQ+LdDA8NZc8h+/MbyXFv1dpShXpr NQD5ls1PS5BDMzePy58FtkcH2Hv6z36Zr7NeM5xCGusjing8I5E09Gt0+S6WNa2dzIf6 tt7yx685XAiAMiWlIL1u1F7qQpu8Kg7GvUqrm9AjdBeUMQghSOg85HAVNvh9cVZ/n9Kf h2xBO+jIeGoDEp1KPJNfhtZPwnTAY0wl8+7wpy7j+O3ru6b7oB/5XXZpSEuR10JDZm0b dTbA== X-Gm-Message-State: AOAM532LolrL86hTBPfsBTBtMpHeEoq1JzgLpNazrXS5ZkdiOxOgljbz sXDmtxLCsETrefsKt3Tvl3QPH1WEBbHu9w== X-Google-Smtp-Source: ABdhPJxkYiXwA6VxKV6lv94F1c892S0/gm4f4kfrBCf0sGfh+9g3lxE3oNbhQLhRd+KpQKq8GIWWng== X-Received: by 2002:a37:bd06:: with SMTP id n6mr3680221qkf.509.1633618388474; Thu, 07 Oct 2021 07:53:08 -0700 (PDT) Received: from ?IPv6:2804:431:c7cb:807a:2864:3aef:e68:8698? ([2804:431:c7cb:807a:2864:3aef:e68:8698]) by smtp.gmail.com with ESMTPSA id v5sm13821242qkh.17.2021.10.07.07.53.07 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 07 Oct 2021 07:53:08 -0700 (PDT) Subject: Re: [PATCH 1/2] Initial support for GNU_PROPERTY_1_NEEDED To: "H.J. Lu" , libc-alpha@sourceware.org References: <20210803215914.4170913-1-hjl.tools@gmail.com> Message-ID: Date: Thu, 7 Oct 2021 11:53:06 -0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0 MIME-Version: 1.0 In-Reply-To: <20210803215914.4170913-1-hjl.tools@gmail.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: Adhemerval Zanella via Libc-alpha Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces+e=80x24.org@sourceware.org Sender: "Libc-alpha" On 03/08/2021 18:59, H.J. Lu via Libc-alpha wrote: > 1. Add GNU_PROPERTY_1_NEEDED: > > #define GNU_PROPERTY_1_NEEDED GNU_PROPERTY_UINT32_OR_LO > > to indicate the needed properties by the object file. > 2. Add GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS: > > #define GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS (1U << 0) > > to indicate that the object file requires canonical function pointers and > cannot be used with copy relocation. > 3. Scan GNU_PROPERTY_1_NEEDED property and store it in l_1_needed. It was added by binutils with commit 6320fd00dc374f74658, maybe add on the commit the version expected to have this support. LGTM, with a small suggestion below. Reviewed-by: Adhemerval Zanella > --- > elf/elf.h | 17 +++++++++++++++++ > sysdeps/generic/dl-prop.h | 9 ++++++++- > sysdeps/generic/link_map.h | 3 ++- > sysdeps/x86/dl-prop.h | 19 ++++++++++++++----- > sysdeps/x86/link_map.h | 2 ++ > 5 files changed, 43 insertions(+), 7 deletions(-) > > diff --git a/elf/elf.h b/elf/elf.h > index 4738dfa28f..50f87baceb 100644 > --- a/elf/elf.h > +++ b/elf/elf.h > @@ -1312,6 +1312,23 @@ typedef struct > /* No copy relocation on protected data symbol. */ > #define GNU_PROPERTY_NO_COPY_ON_PROTECTED 2 > > +/* A 4-byte unsigned integer property: A bit is set if it is set in all > + relocatable inputs. */ > +#define GNU_PROPERTY_UINT32_AND_LO 0xb0000000 > +#define GNU_PROPERTY_UINT32_AND_HI 0xb0007fff > + > +/* A 4-byte unsigned integer property: A bit is set if it is set in any > + relocatable inputs. */ > +#define GNU_PROPERTY_UINT32_OR_LO 0xb0008000 > +#define GNU_PROPERTY_UINT32_OR_HI 0xb000ffff > + > +/* The needed properties by the object file. */ > +#define GNU_PROPERTY_1_NEEDED GNU_PROPERTY_UINT32_OR_LO > + > +/* Set if the object file requires canonical function pointers and > + cannot be used with copy relocation. */ > +#define GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS (1U << 0) > + > /* Processor-specific semantics, lo */ > #define GNU_PROPERTY_LOPROC 0xc0000000 > /* Processor-specific semantics, hi */ Ok. > diff --git a/sysdeps/generic/dl-prop.h b/sysdeps/generic/dl-prop.h > index eaee8052b6..207aadb35d 100644 > --- a/sysdeps/generic/dl-prop.h > +++ b/sysdeps/generic/dl-prop.h > @@ -47,7 +47,14 @@ static inline int __attribute__ ((always_inline)) > _dl_process_gnu_property (struct link_map *l, int fd, uint32_t type, > uint32_t datasz, void *data) > { > - return 0; > + /* Continue until GNU_PROPERTY_1_NEEDED is found. */ > + if (type == GNU_PROPERTY_1_NEEDED) > + { > + if (datasz == 4) > + l->l_1_needed = *(unsigned int *) data; Although the pointer seems to be aligned, I think it would be better to use memcpy here: unsigned int t; memcpy (&t, data, sizeof (t)); l->l_1_needed = t; (the x86 header might use a more relax since the architecture always support unaligned access) > + return 0; > + } > + return 1; > } > > #endif /* _DL_PROP_H */ > diff --git a/sysdeps/generic/link_map.h b/sysdeps/generic/link_map.h > index a056184690..9f482b8c20 100644 > --- a/sysdeps/generic/link_map.h > +++ b/sysdeps/generic/link_map.h > @@ -1 +1,2 @@ > -/* No architecture specific definitions. */ > +/* GNU_PROPERTY_1_NEEDED of this object. */ > +unsigned int l_1_needed; > diff --git a/sysdeps/x86/dl-prop.h b/sysdeps/x86/dl-prop.h > index 56bd020b3c..385548fad3 100644 > --- a/sysdeps/x86/dl-prop.h > +++ b/sysdeps/x86/dl-prop.h > @@ -97,6 +97,7 @@ _dl_process_property_note (struct link_map *l, const ElfW(Nhdr) *note, > > const ElfW(Addr) start = (ElfW(Addr)) note; > > + unsigned int needed_1 = 0; > unsigned int feature_1_and = 0; > unsigned int isa_1_needed = 0; > unsigned int last_type = 0; > @@ -141,7 +142,8 @@ _dl_process_property_note (struct link_map *l, const ElfW(Nhdr) *note, > last_type = type; > > if (type == GNU_PROPERTY_X86_FEATURE_1_AND > - || type == GNU_PROPERTY_X86_ISA_1_NEEDED) > + || type == GNU_PROPERTY_X86_ISA_1_NEEDED > + || type == GNU_PROPERTY_1_NEEDED) > { > /* The sizes of types which we are searching for are > 4 bytes. There is no point to continue if this Ok. > @@ -151,12 +153,18 @@ _dl_process_property_note (struct link_map *l, const ElfW(Nhdr) *note, > > /* NB: Stop the scan only after seeing all types which > we are searching for. */ > - _Static_assert ((GNU_PROPERTY_X86_ISA_1_NEEDED > > - GNU_PROPERTY_X86_FEATURE_1_AND), > + _Static_assert (((GNU_PROPERTY_X86_ISA_1_NEEDED > + > GNU_PROPERTY_X86_FEATURE_1_AND) > + && (GNU_PROPERTY_X86_FEATURE_1_AND > + > GNU_PROPERTY_1_NEEDED)), > "GNU_PROPERTY_X86_ISA_1_NEEDED > " > - "GNU_PROPERTY_X86_FEATURE_1_AND"); > + "GNU_PROPERTY_X86_FEATURE_1_AND && " > + "GNU_PROPERTY_X86_FEATURE_1_AND > " > + "GNU_PROPERTY_1_NEEDED"); > if (type == GNU_PROPERTY_X86_FEATURE_1_AND) > feature_1_and = *(unsigned int *) ptr; > + else if (type == GNU_PROPERTY_1_NEEDED) > + needed_1 = *(unsigned int *) ptr; > else > { > isa_1_needed = *(unsigned int *) ptr; Ok. > @@ -187,9 +195,10 @@ _dl_process_property_note (struct link_map *l, const ElfW(Nhdr) *note, > } > > /* We get here only if there is one or no GNU property note. */ > - if (isa_1_needed != 0 || feature_1_and != 0) > + if (needed_1 != 0 || isa_1_needed != 0 || feature_1_and != 0) > { > l->l_property = lc_property_valid; > + l->l_1_needed = needed_1; > l->l_x86_isa_1_needed = isa_1_needed; > l->l_x86_feature_1_and = feature_1_and; > } Ok. > diff --git a/sysdeps/x86/link_map.h b/sysdeps/x86/link_map.h > index 4c46a25f83..0c7e25dc96 100644 > --- a/sysdeps/x86/link_map.h > +++ b/sysdeps/x86/link_map.h > @@ -29,3 +29,5 @@ unsigned int l_x86_feature_1_and; > > /* GNU_PROPERTY_X86_ISA_1_NEEDED of this object. */ > unsigned int l_x86_isa_1_needed; > + > +#include > Ok.