From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-yw1-x1132.google.com (mail-yw1-x1132.google.com [IPv6:2607:f8b0:4864:20::1132]) by sourceware.org (Postfix) with ESMTPS id 2FA5938346BB for ; Wed, 22 Jun 2022 18:02:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 2FA5938346BB Received: by mail-yw1-x1132.google.com with SMTP id 00721157ae682-3137316bb69so170562227b3.10 for ; Wed, 22 Jun 2022 11:02:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=xTkqUsKI2hgbElRvtn0VwyO4M0vSwRT0ig53tGmdzO0=; b=oLm9Olo8bXcdMkS/uqfpasFfr2xmV5EstKl7y73UyMUsY4Gwpm3VZMLCjSsnB9ai9e uXOYmouaqVpJWjurJtuivsruGLahkJ3ZHdXM2GeilWVPfzSAfGLkBOXwKld11u7e8fq8 GK3rIy2B/A/ZVWE8u1eIidLHq5dZNbo1oJR4ejaoBRgy27OopsJi5EagnjrssFC3H7CE gL1a9CJEAHGro+QqC7fuv0uwXpJlnsKDKgIns9hFms+p4SYU0vfhAPWqS4ExopMdllQ6 88kunIDAC/A0kcGt0RHGiP6wYEgRu/D+UYsJZIKhRrsGGfjLC7uV+ELCEONrqLrREW77 4Onw== X-Gm-Message-State: AJIora8wkEDSSbkRcakgkyBdam6QHco+TfpTW6Hjq0CWBnR1Gusp9lhp IIV6/cDz4kJTc0pJVSqELI3GF1SJqaNFXqbAJ4oj2mlSIBM= X-Google-Smtp-Source: AGRyM1s4HcwZ188+knSGIWTfoASEdVPgAZN0SEFXOfZwgKuagoPHA5XY+4aW3UqnmnAoj3v8yhwIfxFe7q+2b6V1Rk4= X-Received: by 2002:a0d:e804:0:b0:317:9c5f:97a4 with SMTP id r4-20020a0de804000000b003179c5f97a4mr5850005ywe.19.1655920947076; Wed, 22 Jun 2022 11:02:27 -0700 (PDT) MIME-Version: 1.0 References: <20220602065038.3198997-1-maskray@google.com> In-Reply-To: <20220602065038.3198997-1-maskray@google.com> From: Fangrui Song Date: Wed, 22 Jun 2022 11:02:16 -0700 Message-ID: Subject: Re: [PATCH] aarch64: Allow PC-relative relocations against protected STT_FUNC To: binutils@sourceware.org, Szabolcs Nagy , Nick Clifton Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-24.0 required=5.0 tests=BAYES_00, DKIMWL_WL_MED, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, ENV_AND_HDR_SPF_MATCH, GIT_PATCH_0, KAM_STOCKGEN, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE, USER_IN_DEF_DKIM_WL, USER_IN_DEF_SPF_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 Jun 2022 18:02:29 -0000 On Wed, Jun 1, 2022 at 11:50 PM Fangrui Song wrote: > > __attribute__((visibility("protected"))) void *foo() { > return (void *)foo; > } > > gcc -fpic -shared incorrectly fails with: > > relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `foo' which may bind externally can not be used when making a shared object; recompile with -fPIC > > Call _bfd_elf_symbol_refs_local_p with local_protected==true to suppress > the error. The new behavior matches gold and ld.lld. > > Note: if some code tries to use direct access relocations to take the > address of foo (likely due to -fno-pic), the pointer equality will > break, but the error should be reported on that link. > --- > bfd/elfnn-aarch64.c | 2 +- > ld/testsuite/ld-aarch64/aarch64-elf.exp | 1 + > ld/testsuite/ld-aarch64/pcrel-protected.s | 13 +++++++++++++ > ld/testsuite/ld-aarch64/pcrel_pic_protected.d | 7 +++++++ > 4 files changed, 22 insertions(+), 1 deletion(-) > create mode 100644 ld/testsuite/ld-aarch64/pcrel-protected.s > create mode 100644 ld/testsuite/ld-aarch64/pcrel_pic_protected.d > > diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c > index cb316a928ef..2c8e3439d43 100644 > --- a/bfd/elfnn-aarch64.c > +++ b/bfd/elfnn-aarch64.c > @@ -5878,7 +5878,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, > if (bfd_link_pic (info) > && (input_section->flags & SEC_ALLOC) != 0 > && (input_section->flags & SEC_READONLY) != 0 > - && !SYMBOL_REFERENCES_LOCAL (info, h)) > + && !_bfd_elf_symbol_refs_local_p (h, info, 1)) > { > int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START; > > diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp > index 64476f111e0..565a67aa9aa 100644 > --- a/ld/testsuite/ld-aarch64/aarch64-elf.exp > +++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp > @@ -248,6 +248,7 @@ run_dump_test_lp64 "local-addend-r" > # test error handling on pcrel relocation for shared libraries. > run_dump_test_lp64 "pcrel_pic_undefined" > run_dump_test_lp64 "pcrel_pic_defined" > +run_dump_test_lp64 "pcrel_pic_protected" > > run_dump_test "limit-b" > run_dump_test "limit-bl" > diff --git a/ld/testsuite/ld-aarch64/pcrel-protected.s b/ld/testsuite/ld-aarch64/pcrel-protected.s > new file mode 100644 > index 00000000000..ce2a92851ad > --- /dev/null > +++ b/ld/testsuite/ld-aarch64/pcrel-protected.s > @@ -0,0 +1,13 @@ > +.protected protected_a > +.protected protected_b > +.type protected_b, %object > +.protected protected_c > +.type protected_c, %function > + > +.text > + adrp x0, protected_a > + add x0, x0, :lo12:protected_a > + adrp x0, protected_b > + add x0, x0, :lo12:protected_b > + adrp x0, protected_c > + add x0, x0, :lo12:protected_c > diff --git a/ld/testsuite/ld-aarch64/pcrel_pic_protected.d b/ld/testsuite/ld-aarch64/pcrel_pic_protected.d > new file mode 100644 > index 00000000000..1b6f24cf2fb > --- /dev/null > +++ b/ld/testsuite/ld-aarch64/pcrel_pic_protected.d > @@ -0,0 +1,7 @@ > +#name: PC-Rel relocation against protected > +#source: pcrel-protected.s > +#target: [check_shared_lib_support] > +#ld: -shared -e0 --defsym protected_a=0x1000 --defsym protected_b=0x1010 --defsym protected_c=0x1020 > +#readelf: -r -W > +#... > +There are no relocations in this file. > -- > 2.36.1.255.ge46751e96f-goog > :)