From patchwork Sat Mar 25 00:41:11 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nelson Chu X-Patchwork-Id: 74795 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp118087vqo; Fri, 24 Mar 2023 17:41:29 -0700 (PDT) X-Google-Smtp-Source: AKy350Y62mEJ1VYMn+6wAbv2Qda3h9Kyhf55vbron2mi+67a91FR+n2PbNpFGTntG3H6/ALS5mnn X-Received: by 2002:a17:907:d40c:b0:933:3a65:67ed with SMTP id vi12-20020a170907d40c00b009333a6567edmr4999711ejc.75.1679704889500; Fri, 24 Mar 2023 17:41:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1679704889; cv=none; d=google.com; s=arc-20160816; b=gJfISUTTBk/CtQmzRG4jisNeDTpWiq1zb+vjKiSjItbtExZHMLWwf5WfnhFyVsfxX0 kHt73YP8S/3ZVFGnpsqLJmfI0aG14QLSjq3hLSjhpObv8Fb3kbCU/KN5m4OunwMQxsRd CparTcWzY/HWTh4ho0KhNfn5bS/zwOVqXMZXL9fwY0M8z2ohcyIH7C0bFyLRXFFnytWH HsRuEIBMTG9o4RNTXuzDJ8wzeumcZDdP+1aMsQl1258V4MPqRe86xVndzwEpA6wrR4tJ 880F+AicfwGqQ5/IgJALA2GE/fHMnqo3FoRi8un7TatF7EhIwdAoGUzOgqNfKtjCd5ml LPiQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:message-id:date:subject:cc:to:from:dmarc-filter :delivered-to; bh=+X6adtgNCy7hF7hrEihol1g04VJA++G9Lfzom9nRQWU=; b=x7yuUbuXaf+1Fefvusb9tSiqG3CeDNSPFbWbMGoSEyQC/VV0z4bnVC3mnFD47Gi5fO 8VtYPL8DTqvfjdyanNj2e07xjlnWnbpuhQ093Zxhz6dYrhO4mVmr6m0jljG7pfVh0BtK NKbQX4pYLRU+sdq0K9QoDIlPH/C1so27s7OyPwJf2/gynNOhePega1xSgOOjS6LAopLP BVBxdv2Dnx2mXryWqQR/vWdxgIpgMQf5X+3yLjEXjqhHmxiL9lgeOAuQ2s7pRx13cibC 7yvzLmnDcg31PxwYLEodeDBUqw3uOf1QsFnuqTt03cNS5pRb6dB+4BMz8HxfDk6YBcSV e+Eg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org" Received: from sourceware.org (server2.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id 1-20020a170906300100b008d78cb027b7si20716883ejz.667.2023.03.24.17.41.29 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Mar 2023 17:41:29 -0700 (PDT) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org" Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 44AE83858C00 for ; Sat, 25 Mar 2023 00:41:25 +0000 (GMT) X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from NelsondeMBP.localdomain (114-25-107-156.dynamic-ip.hinet.net [114.25.107.156]) by sourceware.org (Postfix) with ESMTP id 1C8533858D28 for ; Sat, 25 Mar 2023 00:41:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 1C8533858D28 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: sourceware.org; spf=none smtp.mailfrom=NelsondeMBP.localdomain Received: by NelsondeMBP.localdomain (Postfix, from userid 501) id 799E5A59E00; Sat, 25 Mar 2023 08:41:14 +0800 (CST) From: Nelson Chu To: binutils@sourceware.org, jim.wilson.gcc@gmail.com, palmer@dabbelt.com Cc: nelson@rivosinc.com Subject: [PATCH 1/3] RISC-V: Extract the ld code which are too complicated, and may be reused. Date: Sat, 25 Mar 2023 08:41:11 +0800 Message-Id: <20230325004113.22673-1-nelson@rivosinc.com> X-Mailer: git-send-email 2.37.1 (Apple Git-137.1) MIME-Version: 1.0 X-Spam-Status: No, score=-4.3 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, KAM_STOCKGEN, KHOP_HELO_FCRDNS, NO_DNS_FOR_FROM, PDS_RDNS_DYNAMIC_FP, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_PBL, RDNS_DYNAMIC, SPF_HELO_NONE, SPF_NONE, TXREP 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: , Errors-To: binutils-bounces+ouuuleilei=gmail.com@sourceware.org Sender: "Binutils" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1761298234469795995?= X-GMAIL-MSGID: =?utf-8?q?1761298234469795995?= These types of codes are different for each target, I am not sure what are the best for RISC-V, so extract them out may be more easy to compare what's the difference. bfd/ * elfnn-riscv.c (RISCV_NEED_DYNAMIC_RELOC): New defined. Extracted from riscv_elf_check_relocs, to see if dynamic reloc is needed for the specific relocation. (RISCV_GENERATE_DYNAMIC_RELOC): New defined. Extracted from riscv_elf_relocate_section, to see if R_RISCV_32/64 need to generate dynamic relocation. (RISCV_COPY_INPUT_RELOC): New defined. Extracted from riscv_elf_relocate_section, to see if R_RISCV_32/64 need to copy itslef tp output file. (RISCV_RESOLVED_LOCALLY): New defined. Extracted from riscv_elf_relocate_section, to see if R_RISCV_GOT_HI20 can be resolved locally. --- bfd/elfnn-riscv.c | 156 ++++++++++++++++++++++++---------------------- 1 file changed, 82 insertions(+), 74 deletions(-) diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index 1200e6b11b5..59e949a2cb5 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -38,6 +38,79 @@ #define CHAR_BIT 8 #endif +/* True if dynamic relocation is needed. If we are creating a shared library, + and this is a reloc against a global symbol, or a non PC relative reloc + against a local symbol, then we need to copy the reloc into the shared + library. However, if we are linking with -Bsymbolic, we do not need to + copy a reloc against a global symbol which is defined in an object we are + including in the link (i.e., DEF_REGULAR is set). + + At this point we have not seen all the input files, so it is possible that + DEF_REGULAR is not set now but will be set later (it is never cleared). + In case of a weak definition, DEF_REGULAR may be cleared later by a strong + definition in a shared library. We account for that possibility below by + storing information in the relocs_copied field of the hash table entry. + A similar situation occurs when creating shared libraries and symbol + visibility changes render the symbol local. + + If on the other hand, we are creating an executable, we may need to keep + relocations for symbols satisfied by a dynamic library if we manage to + avoid copy relocs for the symbol. + + Generate dynamic pointer relocation against STT_GNU_IFUNC symbol in the + non-code section (R_RISCV_32/R_RISCV_64). */ +#define RISCV_NEED_DYNAMIC_RELOC(PCREL, INFO, H, SEC) \ + ((bfd_link_pic (INFO) \ + && ((SEC)->flags & SEC_ALLOC) != 0 \ + && (!(PCREL) \ + || ((H) != NULL \ + && (!(INFO)->symbolic \ + || (H)->root.type == bfd_link_hash_defweak \ + || !(H)->def_regular)))) \ + || (!bfd_link_pic (INFO) \ + && ((SEC)->flags & SEC_ALLOC) != 0 \ + && (H) != NULL \ + && ((H)->root.type == bfd_link_hash_defweak \ + || !(H)->def_regular)) \ + || (!bfd_link_pic (INFO) \ + && (H) != NULL \ + && (H)->type == STT_GNU_IFUNC \ + && ((SEC)->flags & SEC_CODE) == 0)) + +/* True if dynamic relocation should be generated. */ +#define RISCV_GENERATE_DYNAMIC_RELOC(PCREL, INFO, H, RESOLVED_TO_ZERO) \ + ((bfd_link_pic (INFO) \ + && ((H) == NULL \ + || (ELF_ST_VISIBILITY ((H)->other) == STV_DEFAULT && !(RESOLVED_TO_ZERO)) \ + || (H)->root.type != bfd_link_hash_undefweak) \ + && (!(PCREL) \ + || !SYMBOL_CALLS_LOCAL ((INFO), (H)))) \ + || (!bfd_link_pic (INFO) \ + && (H) != NULL \ + && (H)->dynindx != -1 \ + && !(H)->non_got_ref \ + && (((H)->def_dynamic && !(H)->def_regular) \ + || (H)->root.type == bfd_link_hash_undefweak \ + || (H)->root.type == bfd_link_hash_undefined))) + +/* True if this input relocation should be copied to output. H->dynindx + may be -1 if this symbol was marked to become local. */ +#define RISCV_COPY_INPUT_RELOC(INFO, H) \ + ((H) != NULL \ + && (H)->dynindx != -1 \ + && (!bfd_link_pic (INFO) \ + || !SYMBOLIC_BIND ((INFO), (H)) \ + || !(H)->def_regular)) + +/* True if this is actually a static link, or it is a -Bsymbolic link + and the symbol is defined locally, or the symbol was forced to be + local because of a version file. */ +#define RISCV_RESOLVED_LOCALLY(INFO, H) \ + (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (elf_hash_table (INFO)->dynamic_sections_created, \ + bfd_link_pic (INFO), (H)) \ + || (bfd_link_pic (INFO) \ + && SYMBOL_REFERENCES_LOCAL ((INFO), (H)))) + /* Internal relocations used exclusively by the relaxation pass. */ #define R_RISCV_DELETE (R_RISCV_max + 1) @@ -835,48 +908,8 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, } } - /* If we are creating a shared library, and this is a reloc - against a global symbol, or a non PC relative reloc - against a local symbol, then we need to copy the reloc - into the shared library. However, if we are linking with - -Bsymbolic, we do not need to copy a reloc against a - global symbol which is defined in an object we are - including in the link (i.e., DEF_REGULAR is set). At - this point we have not seen all the input files, so it is - possible that DEF_REGULAR is not set now but will be set - later (it is never cleared). In case of a weak definition, - DEF_REGULAR may be cleared later by a strong definition in - a shared library. We account for that possibility below by - storing information in the relocs_copied field of the hash - table entry. A similar situation occurs when creating - shared libraries and symbol visibility changes render the - symbol local. - - If on the other hand, we are creating an executable, we - may need to keep relocations for symbols satisfied by a - dynamic library if we manage to avoid copy relocs for the - symbol. - - Generate dynamic pointer relocation against STT_GNU_IFUNC - symbol in the non-code section (R_RISCV_32/R_RISCV_64). */ - reloc_howto_type * r = riscv_elf_rtype_to_howto (abfd, r_type); - - if ((bfd_link_pic (info) - && (sec->flags & SEC_ALLOC) != 0 - && ((r != NULL && !r->pc_relative) - || (h != NULL - && (!info->symbolic - || h->root.type == bfd_link_hash_defweak - || !h->def_regular)))) - || (!bfd_link_pic (info) - && (sec->flags & SEC_ALLOC) != 0 - && h != NULL - && (h->root.type == bfd_link_hash_defweak - || !h->def_regular)) - || (!bfd_link_pic (info) - && h != NULL - && h->type == STT_GNU_IFUNC - && (sec->flags & SEC_CODE) == 0)) + reloc_howto_type *r = riscv_elf_rtype_to_howto (abfd, r_type); + if (RISCV_NEED_DYNAMIC_RELOC (r->pc_relative, info, h, sec)) { struct elf_dyn_relocs *p; struct elf_dyn_relocs **head; @@ -2329,23 +2362,14 @@ riscv_elf_relocate_section (bfd *output_bfd, case R_RISCV_GOT_HI20: if (h != NULL) { - bool dyn, pic; - off = h->got.offset; BFD_ASSERT (off != (bfd_vma) -1); - dyn = elf_hash_table (info)->dynamic_sections_created; - pic = bfd_link_pic (info); - if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, pic, h) - || (pic && SYMBOL_REFERENCES_LOCAL (info, h))) + if (RISCV_RESOLVED_LOCALLY (info, h)) { - /* This is actually a static link, or it is a - -Bsymbolic link and the symbol is defined - locally, or the symbol was forced to be local - because of a version file. We must initialize - this entry in the global offset table. Since the - offset must always be a multiple of the word size, - we use the least significant bit to record whether + /* We must initialize this entry in the global offset table. + Since the offset must always be a multiple of the word + size, we use the least significant bit to record whether we have initialized it already. When doing a dynamic link, we create a .rela.got @@ -2610,21 +2634,8 @@ riscv_elf_relocate_section (bfd *output_bfd, if ((input_section->flags & SEC_ALLOC) == 0) break; - if ((bfd_link_pic (info) - && (h == NULL - || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT - && !resolved_to_zero) - || h->root.type != bfd_link_hash_undefweak) - && (!howto->pc_relative - || !SYMBOL_CALLS_LOCAL (info, h))) - || (!bfd_link_pic (info) - && h != NULL - && h->dynindx != -1 - && !h->non_got_ref - && ((h->def_dynamic - && !h->def_regular) - || h->root.type == bfd_link_hash_undefweak - || h->root.type == bfd_link_hash_undefined))) + if (RISCV_GENERATE_DYNAMIC_RELOC (howto->pc_relative, info, h, + resolved_to_zero)) { Elf_Internal_Rela outrel; asection *sreloc; @@ -2643,10 +2654,7 @@ riscv_elf_relocate_section (bfd *output_bfd, if (skip_dynamic_relocation) memset (&outrel, 0, sizeof outrel); - else if (h != NULL && h->dynindx != -1 - && !(bfd_link_pic (info) - && SYMBOLIC_BIND (info, h) - && h->def_regular)) + else if (RISCV_COPY_INPUT_RELOC (info, h)) { outrel.r_info = ELFNN_R_INFO (h->dynindx, r_type); outrel.r_addend = rel->r_addend; From patchwork Sat Mar 25 00:41:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nelson Chu X-Patchwork-Id: 74798 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp118267vqo; Fri, 24 Mar 2023 17:42:01 -0700 (PDT) X-Google-Smtp-Source: AKy350aSJkR0RK9yhzacDsqeaF0Xi9kwHikeZ5XQhCuqIFH9bdr7vbKNmyKKWtLIeIpFff7DctSf X-Received: by 2002:a17:906:3806:b0:931:fdf0:7eee with SMTP id v6-20020a170906380600b00931fdf07eeemr4301291ejc.56.1679704921106; Fri, 24 Mar 2023 17:42:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1679704921; cv=none; d=google.com; s=arc-20160816; b=nG3aKmb2OCb+0AMf0XNSSZuTg14YW7F97lNQ23Rb+MPrqYX+KIvzZF0bReNS3TAmy9 0rqV6PXlsflRWh4mKMBG0qCXq8VxQRc3zK69JWGLKYIyPdn1RQvsgz1b/zQg3G62gz2i okSxkfDs81f7qaLkS+uWjJdS6I0drKRgmt8wzILUFBnPZrre3U4Pj14K0EzUKtTxaage Kc+f6fa5cLq49uypSg+BLVlt8lfVDC2wly5djzYnyuO6UL/67b6SqPxJcnrjLPeq5hfu 1I7BX6VUb6LuEMd1el4u6Zp5VVwWyK/CmWRQ3f+mVkUZWlcgo9h3S/GzgFvah+dp+mSJ uu1Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dmarc-filter:delivered-to; bh=egQZwhkFixgYCQvEiaqk3bbb1e1qQGdW6vKxB3wUVfk=; b=ZwI9sMiYwj4fIXCpLC6DOaGiscaFJCHnzbOeRzqzvAq4J9wDuhhLUzSnejvNE2AWDL eCsD98to75KMs82BnRoZN6tQkL73wIXz4GgOF6bE9yn8J2mgZGAVeHi6L0BwT9phzbfg NoBzsjhbkfXbYWjw9p3Qw6BEIzQzATnW/jZ7mVdw2xa4TqwxzALkhwzRXw3d149Brnnx bsUbX6NoDOoTMj9xeDtliy1pkjYgNuQuOZt/p0AdXbIFBMIgbAo9id0b1mkGlwKOYnWG 6W/vqvxBzbyKzxuSrBxVRRKZof1VRN6p+37wXsT6dBT8oy0E46h5uflsMbbY1Gjc7lmv ZkMQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org" Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id sa36-20020a1709076d2400b0093ea690f938si1508537ejc.417.2023.03.24.17.42.00 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Mar 2023 17:42:01 -0700 (PDT) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org" Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id BB077388187C for ; Sat, 25 Mar 2023 00:41:38 +0000 (GMT) X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from NelsondeMBP.localdomain (114-25-107-156.dynamic-ip.hinet.net [114.25.107.156]) by sourceware.org (Postfix) with ESMTP id 1EF3B3858D35 for ; Sat, 25 Mar 2023 00:41:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 1EF3B3858D35 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: sourceware.org; spf=none smtp.mailfrom=NelsondeMBP.localdomain Received: by NelsondeMBP.localdomain (Postfix, from userid 501) id ED6AAA59E04; Sat, 25 Mar 2023 08:41:15 +0800 (CST) From: Nelson Chu To: binutils@sourceware.org, jim.wilson.gcc@gmail.com, palmer@dabbelt.com Cc: nelson@rivosinc.com Subject: [PATCH 2/3] RISC-V: Clarify link behaviors of R_RISCV_32/64 relocations with ABS symbol. Date: Sat, 25 Mar 2023 08:41:12 +0800 Message-Id: <20230325004113.22673-2-nelson@rivosinc.com> X-Mailer: git-send-email 2.37.1 (Apple Git-137.1) In-Reply-To: <20230325004113.22673-1-nelson@rivosinc.com> References: <20230325004113.22673-1-nelson@rivosinc.com> MIME-Version: 1.0 X-Spam-Status: No, score=-4.3 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, KAM_STOCKGEN, KHOP_HELO_FCRDNS, NO_DNS_FOR_FROM, PDS_RDNS_DYNAMIC_FP, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_PBL, RDNS_DYNAMIC, SPF_HELO_NONE, SPF_NONE, TXREP 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: , Errors-To: binutils-bounces+ouuuleilei=gmail.com@sourceware.org Sender: "Binutils" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1761298267548836306?= X-GMAIL-MSGID: =?utf-8?q?1761298267548836306?= There are two improvements, which are all referenced to aarch64, * R_RISCV_32 with non ABS symbol cannot be used under RV64 when making shard objects. * Don't need dynamic relocation for R_RISCV_32/64 under RV32/RV64 when making shared objects, if the referenced symbol is local ABS symbol. However, considering this link, https://github.com/riscv-non-isa/riscv-elf-psabi-doc/issues/341 Seems like we should makes all R_RISCV_32/64 relocs with ABS symbol that don't need any dynamic relocations when making the shared objects. But anyway, I just sync the current behavior as aarch64 ld, in case there are any unexpected behaviors happen. Passed the gcc/binutils regressions in riscv-gnu-toolchain. bfd/ * elfnn-riscv.c (riscv_elf_check_relocs): Only allow R_RISCV_32 with ABS symbol under RV64. (riscv_elf_relocate_section): R_RISCV_32/64 with local ABS symbol under RV32/RV64 doesn't need any dynamic relocation when making shared objects. I just make the implementations similar to other targets, so that will be more easy to mainatain. ld/ * testsuite/ld-riscv-elf/data-reloc*: New testcases. * testsuite/ld-riscv-elf/ld-riscv-elf.exp: Added new data-reloc* testcases, and need to make ifunc-seperate* testcases work for rv32. * testsuite/ld-riscv-elf/ifunc-seperate-caller-nonplt.s: Likewise. * testsuite/ld-riscv-elf/ifunc-seperate-caller-plt.s: Likewise. --- bfd/elfnn-riscv.c | 61 ++++++++++++++++--- .../ld-riscv-elf/data-reloc-rv32-pic.d | 21 +++++++ .../ld-riscv-elf/data-reloc-rv32-pie.d | 18 ++++++ .../ld-riscv-elf/data-reloc-rv32-symbolic.d | 21 +++++++ .../ld-riscv-elf/data-reloc-rv64-abs32-pic.d | 13 ++++ .../ld-riscv-elf/data-reloc-rv64-addr32-pic.d | 4 ++ .../ld-riscv-elf/data-reloc-rv64-pic.d | 21 +++++++ .../ld-riscv-elf/data-reloc-rv64-pie.d | 21 +++++++ .../ld-riscv-elf/data-reloc-rv64-symbolic.d | 21 +++++++ .../data-reloc-rv64-undef32-pic.d | 4 ++ ld/testsuite/ld-riscv-elf/data-reloc.s | 22 +++++++ .../ifunc-seperate-caller-nonplt.s | 2 +- .../ld-riscv-elf/ifunc-seperate-caller-plt.s | 2 +- ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp | 15 +++++ 14 files changed, 236 insertions(+), 10 deletions(-) create mode 100644 ld/testsuite/ld-riscv-elf/data-reloc-rv32-pic.d create mode 100644 ld/testsuite/ld-riscv-elf/data-reloc-rv32-pie.d create mode 100644 ld/testsuite/ld-riscv-elf/data-reloc-rv32-symbolic.d create mode 100644 ld/testsuite/ld-riscv-elf/data-reloc-rv64-abs32-pic.d create mode 100644 ld/testsuite/ld-riscv-elf/data-reloc-rv64-addr32-pic.d create mode 100644 ld/testsuite/ld-riscv-elf/data-reloc-rv64-pic.d create mode 100644 ld/testsuite/ld-riscv-elf/data-reloc-rv64-pie.d create mode 100644 ld/testsuite/ld-riscv-elf/data-reloc-rv64-symbolic.d create mode 100644 ld/testsuite/ld-riscv-elf/data-reloc-rv64-undef32-pic.d create mode 100644 ld/testsuite/ld-riscv-elf/data-reloc.s diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index 59e949a2cb5..00f034a6751 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -734,6 +734,7 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, unsigned int r_type; unsigned int r_symndx; struct elf_link_hash_entry *h; + bool is_abs_symbol = false; r_symndx = ELFNN_R_SYM (rel->r_info); r_type = ELFNN_R_TYPE (rel->r_info); @@ -753,6 +754,8 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, if (isym == NULL) return false; + is_abs_symbol = isym->st_shndx == SHN_ABS ? true : false; + /* Check relocation against local STT_GNU_IFUNC symbol. */ if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC) { @@ -778,6 +781,8 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, while (h->root.type == bfd_link_hash_indirect || h->root.type == bfd_link_hash_warning) h = (struct elf_link_hash_entry *) h->root.u.i.link; + + is_abs_symbol = bfd_is_abs_symbol (&h->root) ? true : false; } if (h != NULL) @@ -879,13 +884,31 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_RISCV_HI20: if (bfd_link_pic (info)) return bad_static_reloc (abfd, r_type, h); - /* Fall through. */ + goto static_reloc; + + case R_RISCV_32: + if (ARCH_SIZE > 32 + && bfd_link_pic (info) + && (sec->flags & SEC_ALLOC) != 0) + { + if (is_abs_symbol) + break; + + reloc_howto_type *r_t = riscv_elf_rtype_to_howto (abfd, r_type); + _bfd_error_handler + (_("%pB: relocation %s against non-absolute symbol `%s' can " + "not be used in RVNN when making a shared object"), + abfd, r_t ? r_t->name : _(""), + h != NULL ? h->root.root.string : "a local symbol"); + bfd_set_error (bfd_error_bad_value); + return false; + } + goto static_reloc; case R_RISCV_COPY: case R_RISCV_JUMP_SLOT: case R_RISCV_RELATIVE: case R_RISCV_64: - case R_RISCV_32: /* Fall through. */ static_reloc: @@ -2630,6 +2653,11 @@ riscv_elf_relocate_section (bfd *output_bfd, break; case R_RISCV_32: + /* Non ABS symbol should be blocked in check_relocs. */ + if (ARCH_SIZE > 32) + break; + /* Fall through. */ + case R_RISCV_64: if ((input_section->flags & SEC_ALLOC) == 0) break; @@ -2639,7 +2667,6 @@ riscv_elf_relocate_section (bfd *output_bfd, { Elf_Internal_Rela outrel; asection *sreloc; - bool skip_static_relocation, skip_dynamic_relocation; /* When generating a shared object, these relocations are copied into the output file to be resolved at run @@ -2648,26 +2675,44 @@ riscv_elf_relocate_section (bfd *output_bfd, outrel.r_offset = _bfd_elf_section_offset (output_bfd, info, input_section, rel->r_offset); - skip_static_relocation = outrel.r_offset != (bfd_vma) -2; - skip_dynamic_relocation = outrel.r_offset >= (bfd_vma) -2; + bool skip = false; + bool relocate = false; + if (outrel.r_offset == (bfd_vma) -1) + skip = true; + else if (outrel.r_offset == (bfd_vma) -2) + { + skip = true; + relocate = true; + } + else if (h != NULL && bfd_is_abs_symbol (&h->root)) + { + /* Don't need dynamic reloc when the ABS symbol is + non-dynamic or forced to local. Maybe just use + SYMBOL_REFERENCES_LOCAL to check? */ + skip = (h->forced_local || (h->dynindx == -1)); + relocate = skip; + } + outrel.r_offset += sec_addr (input_section); - if (skip_dynamic_relocation) - memset (&outrel, 0, sizeof outrel); + if (skip) + memset (&outrel, 0, sizeof outrel); /* R_RISCV_NONE. */ else if (RISCV_COPY_INPUT_RELOC (info, h)) { + /* Maybe just use !SYMBOL_REFERENCES_LOCAL to check? */ outrel.r_info = ELFNN_R_INFO (h->dynindx, r_type); outrel.r_addend = rel->r_addend; } else { + /* This symbol is local, or marked to become local. */ outrel.r_info = ELFNN_R_INFO (0, R_RISCV_RELATIVE); outrel.r_addend = relocation + rel->r_addend; } sreloc = elf_section_data (input_section)->sreloc; riscv_elf_append_rela (output_bfd, sreloc, &outrel); - if (skip_static_relocation) + if (!relocate) continue; } break; diff --git a/ld/testsuite/ld-riscv-elf/data-reloc-rv32-pic.d b/ld/testsuite/ld-riscv-elf/data-reloc-rv32-pic.d new file mode 100644 index 00000000000..13f34e052b7 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/data-reloc-rv32-pic.d @@ -0,0 +1,21 @@ +#source: data-reloc.s +#as: -march=rv32i -mabi=ilp32 -defsym __abs__=1 -defsym __addr__=1 -defsym __undef__=1 +#ld: -m[riscv_choose_ilp32_emul] -Ttext 0x8000 --defsym _start=0x0 --defsym abs=0x100 --defsym abs_local=0x200 -shared +#objdump: -dR + +.*:[ ]+file format .* + + +Disassembly of section .text: + +0+8000 : + 8000: 00000000 .word 0x00000000 + 8000: R_RISCV_32 addr_globl + +0+8004 : + ... + 8004: R_RISCV_RELATIVE \*ABS\*\+0x8004 + 8008: R_RISCV_32 abs + 800c: 00000200 .word 0x00000200 + 8010: 00000000 .word 0x00000000 + 8010: R_RISCV_32 undef diff --git a/ld/testsuite/ld-riscv-elf/data-reloc-rv32-pie.d b/ld/testsuite/ld-riscv-elf/data-reloc-rv32-pie.d new file mode 100644 index 00000000000..1e8f35a9c18 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/data-reloc-rv32-pie.d @@ -0,0 +1,18 @@ +#source: data-reloc.s +#as: -march=rv32i -mabi=ilp32 -defsym __abs__=1 -defsym __addr__=1 +#ld: -m[riscv_choose_ilp32_emul] -Ttext 0x8000 --defsym _start=0x0 --defsym abs=0x100 --defsym abs_local=0x200 -pie +#objdump: -dR + +.*:[ ]+file format .* + +Disassembly of section .text: + +0+8000 : + 8000: 00000000 .word 0x00000000 + 8000: R_RISCV_RELATIVE \*ABS\*\+0x8000 + +0+8004 : + 8004: 00000000 .word 0x00000000 + 8004: R_RISCV_RELATIVE \*ABS\*\+0x8004 + 8008: 00000100 .word 0x00000100 + 800c: 00000200 .word 0x00000200 diff --git a/ld/testsuite/ld-riscv-elf/data-reloc-rv32-symbolic.d b/ld/testsuite/ld-riscv-elf/data-reloc-rv32-symbolic.d new file mode 100644 index 00000000000..5c947e2b93b --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/data-reloc-rv32-symbolic.d @@ -0,0 +1,21 @@ +#source: data-reloc.s +#as: -march=rv32i -mabi=ilp32 -defsym __abs__=1 -defsym __addr__=1 -defsym __undef__=1 +#ld: -m[riscv_choose_ilp32_emul] -Ttext 0x8000 --defsym _start=0x0 --defsym abs=0x100 --defsym abs_local=0x200 -shared -Bsymbolic +#objdump: -dR + +.*:[ ]+file format .* + + +Disassembly of section .text: + +0+8000 : + 8000: 00000000 .word 0x00000000 + 8000: R_RISCV_RELATIVE \*ABS\*\+0x8000 + +0+8004 : + ... + 8004: R_RISCV_RELATIVE \*ABS\*\+0x8004 + 8008: R_RISCV_RELATIVE \*ABS\*\+0x100 + 800c: 00000200 .word 0x00000200 + 8010: 00000000 .word 0x00000000 + 8010: R_RISCV_32 undef diff --git a/ld/testsuite/ld-riscv-elf/data-reloc-rv64-abs32-pic.d b/ld/testsuite/ld-riscv-elf/data-reloc-rv64-abs32-pic.d new file mode 100644 index 00000000000..1d3686de353 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/data-reloc-rv64-abs32-pic.d @@ -0,0 +1,13 @@ +#source: data-reloc.s +#as: -march=rv64i -mabi=lp64 -defsym __abs__=1 +#ld: -m[riscv_choose_lp64_emul] -Ttext 0x8000 --defsym _start=0x0 --defsym abs=0x100 --defsym abs_local=0x200 -shared +#objdump: -dR + +.*:[ ]+file format .* + + +Disassembly of section .text: + +0+8000 <.text>: + 8000: 00000100 .word 0x00000100 + 8004: 00000200 .word 0x00000200 diff --git a/ld/testsuite/ld-riscv-elf/data-reloc-rv64-addr32-pic.d b/ld/testsuite/ld-riscv-elf/data-reloc-rv64-addr32-pic.d new file mode 100644 index 00000000000..39b50e33044 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/data-reloc-rv64-addr32-pic.d @@ -0,0 +1,4 @@ +#source: data-reloc.s +#as: -march=rv64i -mabi=lp64 -defsym __addr__=1 +#ld: -m[riscv_choose_lp64_emul] -Ttext 0x8000 --defsym _start=0x0 -shared +#error: .*relocation R_RISCV_32 against non-absolute symbol `addr_globl' can not be used in RV64 when making a shared object.* diff --git a/ld/testsuite/ld-riscv-elf/data-reloc-rv64-pic.d b/ld/testsuite/ld-riscv-elf/data-reloc-rv64-pic.d new file mode 100644 index 00000000000..dab0ccc9260 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/data-reloc-rv64-pic.d @@ -0,0 +1,21 @@ +#source: data-reloc.s +#as: -march=rv64i -mabi=lp64 -defsym __64_bit__=1 -defsym __abs__=1 -defsym __addr__=1 -defsym __undef__=1 +#ld: -m[riscv_choose_lp64_emul] -Ttext 0x8000 --defsym _start=0x0 --defsym abs=0x100 --defsym abs_local=0x200 -shared +#objdump: -dR + +.*:[ ]+file format .* + + +Disassembly of section .text: + +0+8000 : + ... + 8000: R_RISCV_64 addr_globl + +0+8008 : + ... + 8008: R_RISCV_RELATIVE \*ABS\*\+0x8008 + 8010: R_RISCV_64 abs + 8018: 00000200 .word 0x00000200 + ... + 8020: R_RISCV_64 undef diff --git a/ld/testsuite/ld-riscv-elf/data-reloc-rv64-pie.d b/ld/testsuite/ld-riscv-elf/data-reloc-rv64-pie.d new file mode 100644 index 00000000000..fd6c470f680 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/data-reloc-rv64-pie.d @@ -0,0 +1,21 @@ +#source: data-reloc.s +#as: -march=rv64i -mabi=lp64 -defsym __64_bit__=1 -defsym __abs__=1 -defsym __addr__=1 +#ld: -m[riscv_choose_lp64_emul] -Ttext 0x8000 --defsym _start=0x0 --defsym abs=0x100 --defsym abs_local=0x200 -pie +#objdump: -dR + +.*:[ ]+file format .* + + +Disassembly of section .text: + +0+8000 : + ... + 8000: R_RISCV_RELATIVE \*ABS\*\+0x8000 + +0+8008 : + ... + 8008: R_RISCV_RELATIVE \*ABS\*\+0x8008 + 8010: 00000100 .word 0x00000100 + 8014: 00000000 .word 0x00000000 + 8018: 00000200 .word 0x00000200 + 801c: 00000000 .word 0x00000000 diff --git a/ld/testsuite/ld-riscv-elf/data-reloc-rv64-symbolic.d b/ld/testsuite/ld-riscv-elf/data-reloc-rv64-symbolic.d new file mode 100644 index 00000000000..5d41f869b72 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/data-reloc-rv64-symbolic.d @@ -0,0 +1,21 @@ +#source: data-reloc.s +#as: -march=rv64i -mabi=lp64 -defsym __64_bit__=1 -defsym __abs__=1 -defsym __addr__=1 -defsym __undef__=1 +#ld: -m[riscv_choose_lp64_emul] -Ttext 0x8000 --defsym _start=0x0 --defsym abs=0x100 --defsym abs_local=0x200 -shared -Bsymbolic +#objdump: -dR + +.*:[ ]+file format .* + + +Disassembly of section .text: + +0+8000 : + ... + 8000: R_RISCV_RELATIVE \*ABS\*\+0x8000 + +0+8008 : + ... + 8008: R_RISCV_RELATIVE \*ABS\*\+0x8008 + 8010: R_RISCV_RELATIVE \*ABS\*\+0x100 + 8018: 00000200 .word 0x00000200 + ... + 8020: R_RISCV_64 undef diff --git a/ld/testsuite/ld-riscv-elf/data-reloc-rv64-undef32-pic.d b/ld/testsuite/ld-riscv-elf/data-reloc-rv64-undef32-pic.d new file mode 100644 index 00000000000..e5de484142c --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/data-reloc-rv64-undef32-pic.d @@ -0,0 +1,4 @@ +#source: data-reloc.s +#as: -march=rv64i -mabi=lp64 -defsym __undef__=1 +#ld: -m[riscv_choose_lp64_emul] -Ttext 0x8000 --defsym _start=0x0 -shared +#error: .*relocation R_RISCV_32 against non-absolute symbol `undef' can not be used in RV64 when making a shared object.* diff --git a/ld/testsuite/ld-riscv-elf/data-reloc.s b/ld/testsuite/ld-riscv-elf/data-reloc.s new file mode 100644 index 00000000000..37151500f77 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/data-reloc.s @@ -0,0 +1,22 @@ + .macro DATA symbol +.ifdef __64_bit__ + .quad \symbol +.else + .word \symbol +.endif + .endm +.ifdef __addr__ + .globl addr_globl +addr_globl: + DATA addr_globl +addr_local: + DATA addr_local +.endif +.ifdef __abs__ + .hidden abs_local + DATA abs + DATA abs_local +.endif +.ifdef __undef__ + DATA undef +.endif diff --git a/ld/testsuite/ld-riscv-elf/ifunc-seperate-caller-nonplt.s b/ld/testsuite/ld-riscv-elf/ifunc-seperate-caller-nonplt.s index 23c7254ad5b..df0d33b97e2 100644 --- a/ld/testsuite/ld-riscv-elf/ifunc-seperate-caller-nonplt.s +++ b/ld/testsuite/ld-riscv-elf/ifunc-seperate-caller-nonplt.s @@ -20,4 +20,4 @@ main: .data foo_addr: - .long foo + .quad foo diff --git a/ld/testsuite/ld-riscv-elf/ifunc-seperate-caller-plt.s b/ld/testsuite/ld-riscv-elf/ifunc-seperate-caller-plt.s index 8aa64034706..cc1608a9803 100644 --- a/ld/testsuite/ld-riscv-elf/ifunc-seperate-caller-plt.s +++ b/ld/testsuite/ld-riscv-elf/ifunc-seperate-caller-plt.s @@ -23,4 +23,4 @@ main: .data foo_addr: - .long foo + .quad foo diff --git a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp index 5dd6144efd3..1b2a5ce2cb2 100644 --- a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp +++ b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp @@ -217,6 +217,16 @@ if [istarget "riscv*-*-*"] { run_dump_test "shared-lib-nopic-03" run_dump_test "shared-lib-nopic-04" + run_dump_test "data-reloc-rv64-pic" + run_dump_test "data-reloc-rv64-pie" + run_dump_test "data-reloc-rv64-symbolic" + run_dump_test "data-reloc-rv32-pic" + run_dump_test "data-reloc-rv32-pie" + run_dump_test "data-reloc-rv32-symbolic" + run_dump_test "data-reloc-rv64-abs32-pic" + run_dump_test "data-reloc-rv64-addr32-pic" + run_dump_test "data-reloc-rv64-undef32-pic" + # IFUNC testcases. # Check IFUNC by single type relocs. run_dump_test_ifunc "ifunc-reloc-call-01" rv32 exe @@ -270,6 +280,11 @@ if [istarget "riscv*-*-*"] { run_dump_test_ifunc "ifunc-plt-got-overwrite" rv64 pie run_dump_test_ifunc "ifunc-plt-got-overwrite" rv64 pic + # TODO: Make the following tests work under RV32. + if [istarget "riscv32-*-*"] { + return + } + # Setup shared libraries. run_ld_link_tests { { "Build shared library for IFUNC non-PLT caller" From patchwork Sat Mar 25 00:41:13 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nelson Chu X-Patchwork-Id: 74796 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp118088vqo; Fri, 24 Mar 2023 17:41:29 -0700 (PDT) X-Google-Smtp-Source: AKy350Z3OObQy238170OV+ur5yoV8MGKeaXe2LkVNMD3WZpH65kDtgIn2nhn63evhY6fjgo1TWwh X-Received: by 2002:a17:906:a15a:b0:933:1967:a98a with SMTP id bu26-20020a170906a15a00b009331967a98amr4585534ejb.17.1679704889773; Fri, 24 Mar 2023 17:41:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1679704889; cv=none; d=google.com; s=arc-20160816; b=J7ROu2CK9W/fmtOoFCe9IivxbxV2aDBqRSNIZNXyiFvXnD7GDZfR1X0Ym9ELlbrPSt gNv21hmW7kqH9wp37/RoAtoWBQ/MQ58xsc1x8dcXmF8xggUZPfZODid+01nmVLZOfc4Z 1yFJ2gSSklNvjGF2NQ+pS8PESYgRX2K4wBJ7FJzxhQwMy5b1uqZecGh2Bva8gF6rG2Pl GeHvC9IW/zF1jwCV+qTwkTpLSxnbyheaFVf4b5M2lK4RimiVDf2Ip8cn9H70JPgBFAlE VFl9+rYNvDVfOKy7MagcQeV+8xZTv8heMg5Cud6DR4l/RZaMLmOwQT0eamMThPTvItDy m3sQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dmarc-filter:delivered-to; bh=L9hJPvquZhHOl73U10VGW4fcLpi+oRLCYjWTD/VVouI=; b=wg6LlrngSv36zK5u3BDVLzlELhrhmOMO1aOiwP8pAbFCPLJUvuYPIdRIdaIt+FCF2G PH26CasY33i5F9z4EWwFLjDj9OtJ2fh7PNKOain4pZVJ+HwT73EaxMuaFDUZTvpdHDd5 3Dxk4/lbm3aCOzG3Ts2+qn2JZR+rOLL3y+3KwkxzldbU0gQmWdVhPbcr7zJDJZ0WjSpi JVaYLqNIdo7iJVzggujI7SGS8Lcuv6eV8iOCr15ouTcnzzkOiWcV0VaQKKgxyJJGVgHM QYwbQI8GX9ofPOloYH5PZDS6LS8HPs8AViud9IUQJIgZS8yKY5gf+PpTiSAOh9pAGObc L4zw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org" Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id cr2-20020a170906d54200b008d6d20d1920si20296536ejc.35.2023.03.24.17.41.29 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Mar 2023 17:41:29 -0700 (PDT) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org" Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 1B89D38708C1 for ; Sat, 25 Mar 2023 00:41:25 +0000 (GMT) X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from NelsondeMBP.localdomain (114-25-107-156.dynamic-ip.hinet.net [114.25.107.156]) by sourceware.org (Postfix) with ESMTP id 22D693858CDA for ; Sat, 25 Mar 2023 00:41:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 22D693858CDA Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: sourceware.org; spf=none smtp.mailfrom=NelsondeMBP.localdomain Received: by NelsondeMBP.localdomain (Postfix, from userid 501) id D27E5A59E06; Sat, 25 Mar 2023 08:41:16 +0800 (CST) From: Nelson Chu To: binutils@sourceware.org, jim.wilson.gcc@gmail.com, palmer@dabbelt.com Cc: nelson@rivosinc.com, Palmer Dabbelt Subject: [PATCH 3/3] RISC-V: PR28789, Reject R_RISCV_PCREL relocations with ABS symbol in PIC/PIE. Date: Sat, 25 Mar 2023 08:41:13 +0800 Message-Id: <20230325004113.22673-3-nelson@rivosinc.com> X-Mailer: git-send-email 2.37.1 (Apple Git-137.1) In-Reply-To: <20230325004113.22673-1-nelson@rivosinc.com> References: <20230325004113.22673-1-nelson@rivosinc.com> MIME-Version: 1.0 X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, KAM_STOCKGEN, KHOP_HELO_FCRDNS, NO_DNS_FOR_FROM, PDS_RDNS_DYNAMIC_FP, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_PBL, RDNS_DYNAMIC, SPF_HELO_NONE, SPF_NONE, TXREP 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: , Errors-To: binutils-bounces+ouuuleilei=gmail.com@sourceware.org Sender: "Binutils" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1761298234263418226?= X-GMAIL-MSGID: =?utf-8?q?1761298234263418226?= From: Palmer Dabbelt The non-preemptible SHN_ABS symbol with a pc-relative relocation should be disallowed when generating shared object (pic and pie). Generally, the following cases, which refer to pr25749, will cause a symbol be non-preemptible, * -pie, or -shared with -symbolic * STV_HIDDEN, STV_INTERNAL, STV_PROTECTED * Have dynamic symbol table, but without the symbol * VER_NDX_LOCAL However, PCREL_HI20/LO12 relocs are always bind locally when generating shared object, so not only the non-preemptible absolute symbol need to be disallowed, all absolute symbol references need but except that they are defined in linker script. If we also disallow the absolute symbol in linker script, then the glibc-linux toolchain build failed, so regard them as pc-relative symbols, just like what x86 did. Maybe we should add this check for all pc-relative relocations, rather than just handle in R_RISCV_PCREL relocs. Ideally, since the value of SHN_ABS symbol is a constant, only S - A relocations should be allowed in the shared object, so only BFD_RELOC_8/16/32/64 are allowed, which means R_RISCV_32/R_RISCV_64. bfd/ PR 28789 * elfnn-riscv.c (riscv_elf_check_relocs): The absolute symbol cannot be referneced with pc-relative relocation when generating shared object. ld/ PR 28789 * ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp: Updated. * ld/testsuite/ld-riscv-elf/pcrel-reloc*: New testcases. --- bfd/elfnn-riscv.c | 41 +++++++++++++++++++ ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp | 7 ++++ .../ld-riscv-elf/pcrel-reloc-abs-nopie.d | 14 +++++++ .../ld-riscv-elf/pcrel-reloc-abs-pie.d | 5 +++ ld/testsuite/ld-riscv-elf/pcrel-reloc-abs.s | 2 + .../ld-riscv-elf/pcrel-reloc-rel-nopie.d | 14 +++++++ .../ld-riscv-elf/pcrel-reloc-rel-pie.d | 14 +++++++ ld/testsuite/ld-riscv-elf/pcrel-reloc-rel.s | 9 ++++ ld/testsuite/ld-riscv-elf/pcrel-reloc.s | 5 +++ 9 files changed, 111 insertions(+) create mode 100644 ld/testsuite/ld-riscv-elf/pcrel-reloc-abs-nopie.d create mode 100644 ld/testsuite/ld-riscv-elf/pcrel-reloc-abs-pie.d create mode 100644 ld/testsuite/ld-riscv-elf/pcrel-reloc-abs.s create mode 100644 ld/testsuite/ld-riscv-elf/pcrel-reloc-rel-nopie.d create mode 100644 ld/testsuite/ld-riscv-elf/pcrel-reloc-rel-pie.d create mode 100644 ld/testsuite/ld-riscv-elf/pcrel-reloc-rel.s create mode 100644 ld/testsuite/ld-riscv-elf/pcrel-reloc.s diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index 00f034a6751..0dd9b27c8ae 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -862,6 +862,47 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, ifunc symbol. */ h->plt.refcount += 1; } + + /* The non-preemptible absolute symbol shouldn't be referneced with + pc-relative relocation when generating shared object. However, + PCREL_HI20/LO12 relocs are always bind locally when generating + shared object, so all absolute symbol referenced need to be + disallowed, except they are defined in linker script. + + Maybe we should add this check for all pc-relative relocations, + please see pr28789 and pr25749 for details. */ + if (bfd_link_pic (info) + /* (h == NULL || SYMBOL_REFERENCES_LOCAL (info, h)) */ + && is_abs_symbol) + { + if (h != NULL && (h)->root.ldscript_def) + /* Disallow the absolute symbol defined in linker script here + will cause the glibc-linux toolchain build failed, so regard + them as pc-relative symbols, just like what x86 did. */ + ; + else + { + const char *name; + if (h->root.root.string) + name = h->root.root.string; + else + { + Elf_Internal_Sym *sym; + sym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, abfd, + r_symndx); + name = bfd_elf_sym_name (abfd, symtab_hdr, sym, NULL); + } + + reloc_howto_type *r_t = + riscv_elf_rtype_to_howto (abfd, r_type); + _bfd_error_handler + (_("%pB: relocation %s against absolute symbol `%s' can " + "not be used when making a shared object"), + abfd, r_t ? r_t->name : _(""), name); + bfd_set_error (bfd_error_bad_value); + return false; + } + } /* Fall through. */ case R_RISCV_JAL: diff --git a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp index 1b2a5ce2cb2..43572c5286b 100644 --- a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp +++ b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp @@ -308,4 +308,11 @@ if [istarget "riscv*-*-*"] { run_dump_test "ifunc-seperate-plt-pic" run_dump_test "ifunc-seperate-pcrel-pie" run_dump_test "ifunc-seperate-pcrel-pic" + + # Tests related to mixing medany code into position-independent targets, + # where it's not always possible to generate correct addressing sequences. + run_dump_test "pcrel-reloc-rel-nopie" + run_dump_test "pcrel-reloc-rel-pie" + run_dump_test "pcrel-reloc-abs-nopie" + run_dump_test "pcrel-reloc-abs-pie" } diff --git a/ld/testsuite/ld-riscv-elf/pcrel-reloc-abs-nopie.d b/ld/testsuite/ld-riscv-elf/pcrel-reloc-abs-nopie.d new file mode 100644 index 00000000000..54026388b7a --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/pcrel-reloc-abs-nopie.d @@ -0,0 +1,14 @@ +#source: pcrel-reloc.s +#source: pcrel-reloc-abs.s +#as: -march=rv64i -mabi=lp64 +#ld: -melf64lriscv --no-pie --no-relax +#objdump: -d + +.*:[ ]+file format .* + +Disassembly of section \.text: + +[0-9a-f]+ <_start>: +.*auipc.* +.*lw.*# [0-9a-f]* +#pass diff --git a/ld/testsuite/ld-riscv-elf/pcrel-reloc-abs-pie.d b/ld/testsuite/ld-riscv-elf/pcrel-reloc-abs-pie.d new file mode 100644 index 00000000000..7f5eaa321f7 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/pcrel-reloc-abs-pie.d @@ -0,0 +1,5 @@ +#source: pcrel-reloc.s +#source: pcrel-reloc-abs.s +#as: -march=rv64i -mabi=lp64 +#ld: -melf64lriscv --pie --no-relax +#error: .*relocation R_RISCV_PCREL_HI20 against absolute symbol `sym' can not be used when making a shared objec.*t diff --git a/ld/testsuite/ld-riscv-elf/pcrel-reloc-abs.s b/ld/testsuite/ld-riscv-elf/pcrel-reloc-abs.s new file mode 100644 index 00000000000..1df32a1a3fb --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/pcrel-reloc-abs.s @@ -0,0 +1,2 @@ +.global sym +.set sym,0x8000 diff --git a/ld/testsuite/ld-riscv-elf/pcrel-reloc-rel-nopie.d b/ld/testsuite/ld-riscv-elf/pcrel-reloc-rel-nopie.d new file mode 100644 index 00000000000..ab2a3774cdd --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/pcrel-reloc-rel-nopie.d @@ -0,0 +1,14 @@ +#source: pcrel-reloc.s +#source: pcrel-reloc-rel.s +#as: -march=rv64i -mabi=lp64 +#ld: -melf64lriscv --no-pie --no-relax +#objdump: -d + +.*:[ ]+file format .* + +Disassembly of section \.text: + +[0-9a-f]+ <_start>: +.*auipc.* +.*lw.*# [0-9a-f]* +#pass diff --git a/ld/testsuite/ld-riscv-elf/pcrel-reloc-rel-pie.d b/ld/testsuite/ld-riscv-elf/pcrel-reloc-rel-pie.d new file mode 100644 index 00000000000..aec612d4d2c --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/pcrel-reloc-rel-pie.d @@ -0,0 +1,14 @@ +#source: pcrel-reloc.s +#source: pcrel-reloc-rel.s +#as: -march=rv64i -mabi=lp64 +#ld: -melf64lriscv --pie --no-relax +#objdump: -d + +.*:[ ]+file format .* + +Disassembly of section \.text: + +[0-9a-f]+ <_start>: +.*auipc.* +.*lw.*# [0-9a-f]* +#pass diff --git a/ld/testsuite/ld-riscv-elf/pcrel-reloc-rel.s b/ld/testsuite/ld-riscv-elf/pcrel-reloc-rel.s new file mode 100644 index 00000000000..fb0e6c09f22 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/pcrel-reloc-rel.s @@ -0,0 +1,9 @@ +.data +# Makes sure "sym" doesn't end up at the beginning of ".data", as that makes it +# tough to then later detect it from scripts. +.global buf +buf: + .fill 8192, 4, 1 +.global sym +sym: + .fill 8192, 4, 2 diff --git a/ld/testsuite/ld-riscv-elf/pcrel-reloc.s b/ld/testsuite/ld-riscv-elf/pcrel-reloc.s new file mode 100644 index 00000000000..db2103bafd1 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/pcrel-reloc.s @@ -0,0 +1,5 @@ +.text +.global _start +_start: + auipc t0, %pcrel_hi(sym) + lw t0, %pcrel_lo(_start)(t0)