From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id 81D063846062 for ; Fri, 19 Apr 2024 09:59:31 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 81D063846062 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 81D063846062 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=1713520774; cv=none; b=hmbwdcJ23JjmWOXjvOwO5/kaY57D6P4+ve31Cav6W+KpF9baH3jijfDNIOjgL9DlUjuKfjhh3fdT5+VJZ3g2elbEa66iA2Rv7BoR7iY6LC+TJAe+Z7gLgyXnwoNyT2IwhOg3zqOmCPGV258lqn1Gq8q1d4YODn0ycG69UMeViFI= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713520774; c=relaxed/simple; bh=lkap8Xbja3o0BuF9LocOOCu865A4WrkKWmmzknMWxmg=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=iDv9GbwOnixH2IQlvVfli0HJ4DLT91zGbHitb8gjNtDBAECEWTuDetkXD97BZyPN0lYQUFlt5ZeNb7hXsy/ZhkxmCOtY/7IxcapD/UGGL2ZmJV4sg9X6TrR+Dtve6LOK3UMrLtSIZ3XUSYGLnqv1tEs9M4IHJS8qS/Bhy73DkA4= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from loongson.cn (unknown [10.2.6.5]) by gateway (Coremail) with SMTP id _____8Dx97mBQCJmtL4pAA--.13587S3; Fri, 19 Apr 2024 17:59:29 +0800 (CST) Received: from 5.5.5 (unknown [10.2.6.5]) by localhost.localdomain (Coremail) with SMTP id AQAAf8Cx_c6AQCJmEhuAAA--.46973S4; Fri, 19 Apr 2024 17:59:28 +0800 (CST) From: Lulu Cai To: binutils@sourceware.org Cc: xuchenghua@loongson.cn, chenglulu@loongson.cn, liuzhensong@loongson.cn, mengqinggang@loongson.cn, xry111@xry111.site, i.swmail@xen0n.name, maskray@google.com, luweining@loongson.cn, hejinyang@loongson.cn, Lulu Cai Subject: [PATCH v2] LoongArch: Add bad static relocation check and output more information to user Date: Fri, 19 Apr 2024 17:59:26 +0800 Message-Id: <20240419095926.2470623-1-cailulu@loongson.cn> X-Mailer: git-send-email 2.39.3 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CM-TRANSID:AQAAf8Cx_c6AQCJmEhuAAA--.46973S4 X-CM-SenderInfo: xfdlz3tox6z05rqj20fqof0/1tbiAQAMB2YiK2wBxgABsP X-Coremail-Antispam: 1Uk129KBj93XoWxtry3GF1xZw1xAr48Cr1rGrX_yoWxtrW7p3 43Z34FkF4rAFnrWryDuay5u3Z5Ga97GFy7WasIqr109rs8XryrX3WIkryfXFy5J3yrtrZ0 vry0q345ZF1kXwcCm3ZEXasCq-sJn29KB7ZKAUJUUUU5529EdanIXcx71UUUUU7KY7ZEXa sCq-sGcSsGvfJ3Ic02F40EFcxC0VAKzVAqx4xG6I80ebIjqfuFe4nvWSU5nxnvy29KBjDU 0xBIdaVrnRJUUUkYb4IE77IF4wAFF20E14v26r1j6r4UM7CY07I20VC2zVCF04k26cxKx2 IYs7xG6rWj6s0DM7CIcVAFz4kK6r106r15M28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48v e4kI8wA2z4x0Y4vE2Ix0cI8IcVAFwI0_Xr0_Ar1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI 0_Gr0_Cr1l84ACjcxK6I8E87Iv67AKxVW8Jr0_Cr1UM28EF7xvwVC2z280aVCY1x0267AK xVWxJr0_GcWle2I262IYc4CY6c8Ij28IcVAaY2xG8wAqjxCEc2xF0cIa020Ex4CE44I27w Aqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E2Ix0cI8IcVAFwI0_Jw0_WrylYx0Ex4A2jsIE 14v26r4j6F4UMcvjeVCFs4IE7xkEbVWUJVW8JwACjcxG0xvY0x0EwIxGrwCF04k20xvY0x 0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E 7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcV C0I7IYx2IY67AKxVWUCVW8JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Jr0_Gr1lIxAIcVCF 04k26cxKx2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7 CjxVAFwI0_Jr0_GrUvcSsGvfC2KfnxnUUI43ZEXa7IU8QJ57UUUUU== X-Spam-Status: No, score=-13.1 required=5.0 tests=BAYES_00,GIT_PATCH_0,KAM_DMARC_STATUS,SPF_HELO_NONE,SPF_PASS,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 List-Id: Absolute address symbols cannot be used with -shared. We output more information to the user than just BFD_ASSETR. --- Changes from v1: * Outputs the section and offset information of the problematic relocation. V1 link: https://sourceware.org/pipermail/binutils/2024-March/133120.html --- bfd/elfnn-loongarch.c | 33 +++++++++++++++++-- .../ld-loongarch-elf/ld-loongarch-elf.exp | 3 ++ .../ld-loongarch-elf/reloc_abs_with_shared.d | 6 ++++ .../ld-loongarch-elf/reloc_abs_with_shared.s | 9 +++++ .../ld-loongarch-elf/reloc_le_with_shared.d | 6 ++++ .../ld-loongarch-elf/reloc_le_with_shared.s | 8 +++++ .../ld-loongarch-elf/reloc_ler_with_shared.d | 4 +++ .../ld-loongarch-elf/reloc_ler_with_shared.s | 9 +++++ 8 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 ld/testsuite/ld-loongarch-elf/reloc_abs_with_shared.d create mode 100644 ld/testsuite/ld-loongarch-elf/reloc_abs_with_shared.s create mode 100644 ld/testsuite/ld-loongarch-elf/reloc_le_with_shared.d create mode 100644 ld/testsuite/ld-loongarch-elf/reloc_le_with_shared.s create mode 100644 ld/testsuite/ld-loongarch-elf/reloc_ler_with_shared.d create mode 100644 ld/testsuite/ld-loongarch-elf/reloc_ler_with_shared.s diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c index 7b493f6f05b..0a8a40a16bb 100644 --- a/bfd/elfnn-loongarch.c +++ b/bfd/elfnn-loongarch.c @@ -753,6 +753,33 @@ loongarch_tls_transition (bfd *input_bfd, allocate space in the global offset table or procedure linkage table. */ +static bool +bad_static_reloc (bfd *abfd, const Elf_Internal_Rela *rel, asection *sec, + unsigned r_type, struct elf_link_hash_entry *h, + Elf_Internal_Sym *isym) +{ + /* We propably can improve the information to tell users that they should + be recompile the code with -fPIC or -fPIE, just like what x86 does. */ + reloc_howto_type * r = loongarch_elf_rtype_to_howto (abfd, r_type); + const char *name = NULL; + + if (h) + name = h->root.root.string; + else if (isym) + name = bfd_elf_string_from_elf_section (abfd, + elf_symtab_hdr (abfd).sh_link, + isym->st_name); + if (name == NULL || *name == '\0') + name =""; + + (*_bfd_error_handler) + (_("%pB:(%pA+%#lx): relocation %s against `%s` can not be used when making " + "a shared object; recompile with -fPIC"), + abfd, sec, rel->r_offset, r ? r->name : _(""), name); + bfd_set_error (bfd_error_bad_value); + return false; +} + static bool loongarch_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, const Elf_Internal_Rela *relocs) @@ -897,7 +924,7 @@ loongarch_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_LARCH_TLS_LE_HI20_R: case R_LARCH_SOP_PUSH_TLS_TPREL: if (!bfd_link_executable (info)) - return false; + return bad_static_reloc (abfd, rel, sec, r_type, h, isym); if (!loongarch_elf_record_tls_and_got_reference (abfd, info, h, r_symndx, @@ -915,6 +942,9 @@ loongarch_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_LARCH_ABS_HI20: case R_LARCH_SOP_PUSH_ABSOLUTE: + if (bfd_link_pic (info)) + return bad_static_reloc (abfd, rel, sec, r_type, h, isym); + if (h != NULL) /* If this reloc is in a read-only section, we might need a copy reloc. We can't check reliably at this @@ -3391,7 +3421,6 @@ loongarch_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, case R_LARCH_ABS_LO12: case R_LARCH_ABS64_LO20: case R_LARCH_ABS64_HI12: - BFD_ASSERT (!is_pic); if (is_undefweak) { diff --git a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp index c2d616b8d0a..40f56576cbc 100644 --- a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp +++ b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp @@ -134,6 +134,9 @@ if [istarget "loongarch64-*-*"] { run_dump_test "desc-norelax" run_dump_test "desc-relax" run_dump_test "data-got" + run_dump_test "reloc_le_with_shared" + run_dump_test "reloc_ler_with_shared" + run_dump_test "reloc_abs_with_shared" } if [check_pie_support] { diff --git a/ld/testsuite/ld-loongarch-elf/reloc_abs_with_shared.d b/ld/testsuite/ld-loongarch-elf/reloc_abs_with_shared.d new file mode 100644 index 00000000000..532e84fb600 --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/reloc_abs_with_shared.d @@ -0,0 +1,6 @@ +#source: reloc_abs_with_shared.s +#as: +#ld: -shared +#error: .*relocation R_LARCH_ABS_HI20 against `s` can not be used when making a shared object; recompile with -fPIC +#... +#pass diff --git a/ld/testsuite/ld-loongarch-elf/reloc_abs_with_shared.s b/ld/testsuite/ld-loongarch-elf/reloc_abs_with_shared.s new file mode 100644 index 00000000000..13341af2bd9 --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/reloc_abs_with_shared.s @@ -0,0 +1,9 @@ + .text + .globl s + .data + .type s, @object + s: + .word 123 + .text + lu12i.w $r4,%abs_hi20(s) + addi.d $r4,$r4,%abs_lo12(s) diff --git a/ld/testsuite/ld-loongarch-elf/reloc_le_with_shared.d b/ld/testsuite/ld-loongarch-elf/reloc_le_with_shared.d new file mode 100644 index 00000000000..562b079af44 --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/reloc_le_with_shared.d @@ -0,0 +1,6 @@ +#source: reloc_le_with_shared.s +#as: +#ld: -shared +#error: .*relocation R_LARCH_TLS_LE_HI20 against `s` can not be used when making a shared object; recompile with -fPIC +#... +#pass diff --git a/ld/testsuite/ld-loongarch-elf/reloc_le_with_shared.s b/ld/testsuite/ld-loongarch-elf/reloc_le_with_shared.s new file mode 100644 index 00000000000..c720665002b --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/reloc_le_with_shared.s @@ -0,0 +1,8 @@ + .text + .globl s + .section .tdata,"awT",@progbits + .type s, @object + s: + .word 123 + .text + la.tls.le $r4, s diff --git a/ld/testsuite/ld-loongarch-elf/reloc_ler_with_shared.d b/ld/testsuite/ld-loongarch-elf/reloc_ler_with_shared.d new file mode 100644 index 00000000000..7382d5b8e1a --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/reloc_ler_with_shared.d @@ -0,0 +1,4 @@ +#source: reloc_ler_with_shared.s +#as: +#ld: -shared +#error: .*relocation R_LARCH_TLS_LE_HI20_R against `s` can not be used when making a shared object; recompile with -fPIC diff --git a/ld/testsuite/ld-loongarch-elf/reloc_ler_with_shared.s b/ld/testsuite/ld-loongarch-elf/reloc_ler_with_shared.s new file mode 100644 index 00000000000..a9e5696715c --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/reloc_ler_with_shared.s @@ -0,0 +1,9 @@ + .text + .globl s + .section .tdata,"awT",@progbits + .type s, @object + s: + .word 123 + .text + lu12i.w $r4,%le_hi20_r(s) + add.d $r4,$r4,$r2,%le_add_r(s) -- 2.36.0