From patchwork Fri Aug 16 01:33:51 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lulu Cai X-Patchwork-Id: 95963 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 12304385828E for ; Fri, 16 Aug 2024 01:34:39 +0000 (GMT) X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id 78BF33858D28 for ; Fri, 16 Aug 2024 01:33:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 78BF33858D28 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 78BF33858D28 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=114.242.206.163 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1723772042; cv=none; b=btLTDHH3FkpUoIiWene37CjVpQROqQ3ec+11g0gaYqk1ft3JXZ5blYraTfk+s51hxL8VOGJwfjLCeiDgZe/W4FgFoZcW8eMuMo9N0FCh5nu62YCPygVaqwyoxNl+j46Cet+AbrJpSOZRjAbLSYWW2yKMV9v6RTg4LCZhS+yDBV0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1723772042; c=relaxed/simple; bh=Stt8TKkbB5l82BQ0l+sMKUuh3r9u5EHWu3fDLmtQFBI=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=k9EWG61D1m7GTf2HEteFbhnMAeOEY8C8jh6QC+O43zw9m2nGMxz5E1KXcWgsCRmF+LsY/lTADKH4hnquZHmnEN9xnC86Cihb20+x5IDsPBYnsO4EwZHZJw9S8e59UZjO/HqpdU1eE5W/b8K558KLE1A3T90phP0AhaigsfuldYA= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from loongson.cn (unknown [10.2.6.5]) by gateway (Coremail) with SMTP id _____8Bx7eqBrL5mabkVAA--.50468S3; Fri, 16 Aug 2024 09:33:53 +0800 (CST) Received: from 5.5.5 (unknown [10.2.6.5]) by front1 (Coremail) with SMTP id qMiowMDxG2eBrL5mcVUWAA--.6589S4; Fri, 16 Aug 2024 09:33:53 +0800 (CST) From: Lulu Cai To: binutils@sourceware.org Cc: xuchenghua@loongson.cn, chenglulu@loongson.cn, mengqinggang@loongson.cn, xry111@xry111.site, i.swmail@xen0n.name, maskray@google.com, luweining@loongson.cn, hejinyang@loongson.cn, wangxin03@loongson.cn, Lulu Cai Subject: [PATCH v2] LoongArch: Fix wrong relocation handling of symbols defined by PROVIDE Date: Fri, 16 Aug 2024 09:33:51 +0800 Message-Id: <20240816013351.2068636-1-cailulu@loongson.cn> X-Mailer: git-send-email 2.39.3 MIME-Version: 1.0 X-CM-TRANSID: qMiowMDxG2eBrL5mcVUWAA--.6589S4 X-CM-SenderInfo: xfdlz3tox6z05rqj20fqof0/1tbiAgELB2a975kKLAAAsE X-Coremail-Antispam: 1Uk129KBj93XoWxCr4UAw4fur4xCr1DGFyrZrc_yoWrtw4kp3 W5ZrySkF1kJFnrWr9xC3y5XFn3WFZ7KFy2qa4fta4I9rn5Xry8Xw10yrW3JF43Xw4qyF1F v340v345CFs8JwcCm3ZEXasCq-sJn29KB7ZKAUJUUUU5529EdanIXcx71UUUUU7KY7ZEXa sCq-sGcSsGvfJ3Ic02F40EFcxC0VAKzVAqx4xG6I80ebIjqfuFe4nvWSU5nxnvy29KBjDU 0xBIdaVrnRJUUUvFb4IE77IF4wAFF20E14v26r1j6r4UM7CY07I20VC2zVCF04k26cxKx2 IYs7xG6rWj6s0DM7CIcVAFz4kK6r106r15M28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48v e4kI8wA2z4x0Y4vE2Ix0cI8IcVAFwI0_Gr0_Xr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI 0_Gr0_Cr1l84ACjcxK6I8E87Iv67AKxVWxJVW8Jr1l84ACjcxK6I8E87Iv6xkF7I0E14v2 6r4j6r4UJwAS0I0E0xvYzxvE52x082IY62kv0487Mc804VCY07AIYIkI8VC2zVCFFI0UMc 02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7IYx2IY67AKxVWUXVWUAwAv7VC2z280aVAF wI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0Y48IcxkI7VAKI48JMxAIw28IcxkI7V AKI48JMxC20s026xCaFVCjc4AY6r1j6r4UMxCIbckI1I0E14v26r1Y6r17MI8I3I0E5I8C rVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAFwI0_JrI_JrWlx4CE17CEb7AF67AKxVWUtVW8Zw CIc40Y0x0EwIxGrwCI42IY6xIIjxv20xvE14v26r1j6r1xMIIF0xvE2Ix0cI8IcVCY1x02 67AKxVWUJVW8JwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Jr 0_Gr1lIxAIcVC2z280aVCY1x0267AKxVWUJVW8JbIYCTnIWIevJa73UjIFyTuYvjxU7XTm DUUUU X-Spam-Status: No, score=-13.0 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE 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.30 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: binutils-bounces~patchwork=sourceware.org@sourceware.org If the symbol defined by PROVIDE in the linker scripts is not in SECTION, the symbol is placed in the ABS section. The linker considers that symbols in the ABS section do not need to calculate PC relative offsets. We only allow ABS symbols defined in the linker scripts to be affected by PC relative relocations. --- Changes from v1: * Only ABS symbols defined in the linker scripts can be affected by PC relative relocations. v1 link: https://sourceware.org/pipermail/binutils/2024-August/136211.html --- bfd/elfnn-loongarch.c | 15 +++++++++++---- .../ld-loongarch-elf/ld-loongarch-elf.exp | 3 +++ ld/testsuite/ld-loongarch-elf/provide_abs.d | 12 ++++++++++++ ld/testsuite/ld-loongarch-elf/provide_abs.ld | 1 + ld/testsuite/ld-loongarch-elf/provide_noabs.d | 13 +++++++++++++ ld/testsuite/ld-loongarch-elf/provide_noabs.ld | 7 +++++++ ld/testsuite/ld-loongarch-elf/provide_sym.s | 7 +++++++ 7 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 ld/testsuite/ld-loongarch-elf/provide_abs.d create mode 100644 ld/testsuite/ld-loongarch-elf/provide_abs.ld create mode 100644 ld/testsuite/ld-loongarch-elf/provide_noabs.d create mode 100644 ld/testsuite/ld-loongarch-elf/provide_noabs.ld create mode 100644 ld/testsuite/ld-loongarch-elf/provide_sym.s diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c index f58ced30ac3..59dfd03d089 100644 --- a/bfd/elfnn-loongarch.c +++ b/bfd/elfnn-loongarch.c @@ -3315,10 +3315,17 @@ loongarch_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, script. Also for R_*_SOP_PUSH_ABSOLUTE and PCREL to specify const. */ if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec)) { - defined_local = false; - resolved_local = false; - resolved_dynly = false; - resolved_to_const = true; + /* Allows ABS symbols defined in the linker script to be referenced + by pc relative relocations. */ + if (h != NULL && (h)->root.ldscript_def) + ; + else + { + defined_local = false; + resolved_local = false; + resolved_dynly = false; + resolved_to_const = true; + } } /* The ifunc reference generate plt. */ diff --git a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp index d80014d9563..4328f6e941e 100644 --- a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp +++ b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp @@ -184,5 +184,8 @@ if [istarget "loongarch64-*-*"] { run_dump_test "ie-le-relax" run_dump_test "tlsdesc_abs" run_dump_test "tlsdesc_extreme" + run_dump_test "provide_abs" + run_dump_test "provide_noabs" + } diff --git a/ld/testsuite/ld-loongarch-elf/provide_abs.d b/ld/testsuite/ld-loongarch-elf/provide_abs.d new file mode 100644 index 00000000000..1514fb18b01 --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/provide_abs.d @@ -0,0 +1,12 @@ +#source: provide_sym.s +#as: +#ld: -T provide_abs.ld +#objdump: -d + +.*: +file format .* + +#... + 0: 58001085 beq \$a0, \$a1, 16 # 10 + 4: 40000c80 beqz \$a0, 12 # 10 + 8: 54000800 bl 8 # 10 +#pass diff --git a/ld/testsuite/ld-loongarch-elf/provide_abs.ld b/ld/testsuite/ld-loongarch-elf/provide_abs.ld new file mode 100644 index 00000000000..473476cdc65 --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/provide_abs.ld @@ -0,0 +1 @@ +PROVIDE(fun1 = 0x10); diff --git a/ld/testsuite/ld-loongarch-elf/provide_noabs.d b/ld/testsuite/ld-loongarch-elf/provide_noabs.d new file mode 100644 index 00000000000..7d6bc4d1baf --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/provide_noabs.d @@ -0,0 +1,13 @@ +#source: provide_sym.s +#as: +#ld: -T provide_noabs.ld +#objdump: -d + +.*: +file format .* + + +#... + 0: 58001085 beq \$a0, \$a1, 16 # 10 + 4: 40000c80 beqz \$a0, 12 # 10 + 8: 54000800 bl 8 # 10 +#pass diff --git a/ld/testsuite/ld-loongarch-elf/provide_noabs.ld b/ld/testsuite/ld-loongarch-elf/provide_noabs.ld new file mode 100644 index 00000000000..0154c6f3a29 --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/provide_noabs.ld @@ -0,0 +1,7 @@ +SECTIONS +{ + .text : + { + PROVIDE(fun1 = 0x10); + } +} diff --git a/ld/testsuite/ld-loongarch-elf/provide_sym.s b/ld/testsuite/ld-loongarch-elf/provide_sym.s new file mode 100644 index 00000000000..6610894edbe --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/provide_sym.s @@ -0,0 +1,7 @@ + .text + .globl main + .type main, @function +main: + beq $a0,$a1,%b16(fun1) + beqz $a0,%b21(fun1) + bl %b26(fun1)