From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 88180 invoked by alias); 18 Oct 2017 10:40:49 -0000 Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org Received: (qmail 87156 invoked by uid 89); 18 Oct 2017 10:40:48 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LAZY_DOMAIN_SECURITY,RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy= X-HELO: foss.arm.com Received: from foss.arm.com (HELO foss.arm.com) (217.140.101.70) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 18 Oct 2017 10:40:47 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 24F191435; Wed, 18 Oct 2017 03:40:46 -0700 (PDT) Received: from [10.2.207.43] (e104453-lin.cambridge.arm.com [10.2.207.43]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 56A603F25D; Wed, 18 Oct 2017 03:40:45 -0700 (PDT) From: Renlin Li Subject: [BFD][AARCH64]Disallow R_AARCH64_ABS32(LP64) & R_AARCH64_ABS16 in const section of shared object To: "binutils@sourceware.org" , Nicholas Clifton , Ramana Radhakrishnan , Richard Earnshaw Message-ID: <59E72FAB.6000804@foss.arm.com> Date: Wed, 18 Oct 2017 10:40:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------030407090001060008080808" X-IsSubscribed: yes X-SW-Source: 2017-10/txt/msg00277.txt.bz2 This is a multi-part message in MIME format. --------------030407090001060008080808 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-length: 2374 Hi all, R_AARCH64_ABS64, R_AARCH64_ABS32 and R_AARCH64_ABS16 are data relocations supported in AArch64 elf ABI. R_AARCH64_ABS64 under LP64 is allowed in shared object and a dynamic relocation entry will be generated. This allows the dynamic linker to do further symbol resolution. R_AARCH64_ABS32 likewise is allowed in shared object, however under ILP32 abi. The original behavior for R_AARCH64_ABS32 under LP64 is that, it's allowed in shared object and silently resolved at static linking time. No dynamic relocation entry is generate for it. R_AARCH64_ABS16 is allowed in shared object under both L64 and ILP32. It's resolved at static linking time as well. Under LP64, the address should be 64-bit. R_AARCH64_ABS32 relocation indicates an address that is only sized 32 bits which is not correct in LP64 shared object. It's useful to error out. I have checked glibc dynamic linker code, R_AARCH64_ABS16 is not supported at all. So R_AARCH64_ABS16 should be reject in shared object completely. In this patch, R_AARCH64_ABS32 is rejected under LP64 in read-only section of shared object. R_AARCH64_ABS16 is rejected in constant section of shared object in both ABI. This will sometimes provide useful information for buggy code. By the way, glibc aarch64 elf_machine_load_address is using R_AARCH64_ABS32 to hold an address even in LP64. I had a discussion here sometime ago. The change here will break the glibc build. This patch will not be committed until glibc has been fixed. https://sourceware.org/ml/libc-alpha/2017-10/msg00816.html testcases are also added. Binutils regression checked OK. Linux kernel linked OK with new binutils. OK for trunk? Regards, Renlin Li ld/ChangeLog: 2017-10-18 Renlin Li * testsuite/ld-aarch64/aarch64-elf.exp: Run new test cases. * testsuite/ld-aarch64/emit-relocs-258-dyn-bad.d: New. * testsuite/ld-aarch64/emit-relocs-258.s: New. * testsuite/ld-aarch64/emit-relocs-259-dyn-bad.d: New. * testsuite/ld-aarch64/emit-relocs-259.s: New. * testsuite/ld-aarch64/gc-relocs-257.s: Put R_AARCH64_ABS32, R_AARCH64_ABS16 data into data section. bfd/ChangeLog: 2017-10-18 Renlin Li * elfnn-aarch64.c (elfNN_aarch64_check_relocs): Disallow BFD_RELOC_AARCH64_16 in shared object const section. Disallow BFD_RELOC_AARCH64_32 in shared object const section under LP64. --------------030407090001060008080808 Content-Type: text/x-patch; name="tmp.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="tmp.diff" Content-length: 3151 diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 23c881c..bdc7c80 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -7058,11 +7058,17 @@ elfNN_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info, switch (bfd_r_type) { + case BFD_RELOC_AARCH64_16: +#if ARCH_SIZE == 64 + case BFD_RELOC_AARCH64_32: +#endif case BFD_RELOC_AARCH64_MOVW_G0_NC: case BFD_RELOC_AARCH64_MOVW_G1_NC: case BFD_RELOC_AARCH64_MOVW_G2_NC: case BFD_RELOC_AARCH64_MOVW_G3: - if (bfd_link_pic (info)) + if (bfd_link_pic (info) + && (sec->flags & SEC_ALLOC) != 0 + && (sec->flags & SEC_READONLY) != 0) { int howto_index = bfd_r_type - BFD_RELOC_AARCH64_RELOC_START; _bfd_error_handler diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp index b9c9885..fbc4f86 100644 --- a/ld/testsuite/ld-aarch64/aarch64-elf.exp +++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp @@ -103,6 +103,8 @@ run_dump_test_lp64 "emit-relocs-257" run_dump_test_lp64 "emit-relocs-257-be" # 258 is tested in 257 # 259 is tested in 257 +run_dump_test "emit-relocs-258-dyn-bad" +run_dump_test "emit-relocs-259-dyn-bad" run_dump_test_lp64 "emit-relocs-260" run_dump_test_lp64 "emit-relocs-260-be" # 261 is tested by 260 diff --git a/ld/testsuite/ld-aarch64/emit-relocs-258-dyn-bad.d b/ld/testsuite/ld-aarch64/emit-relocs-258-dyn-bad.d new file mode 100644 index 0000000..cbd4577 --- /dev/null +++ b/ld/testsuite/ld-aarch64/emit-relocs-258-dyn-bad.d @@ -0,0 +1,4 @@ +#name: LP64 R_AARCH64_ABS32 shared library test +#source: emit-relocs-258.s +#ld: -shared +#error: .*: relocation R_AARCH64_ABS32 against `dummy' can not be used when making a shared object; recompile with -fPIC diff --git a/ld/testsuite/ld-aarch64/emit-relocs-258.s b/ld/testsuite/ld-aarch64/emit-relocs-258.s new file mode 100644 index 0000000..f724776 --- /dev/null +++ b/ld/testsuite/ld-aarch64/emit-relocs-258.s @@ -0,0 +1,6 @@ +.text + + ldr x0, .L1 + +.L1: + .word dummy diff --git a/ld/testsuite/ld-aarch64/emit-relocs-259-dyn-bad.d b/ld/testsuite/ld-aarch64/emit-relocs-259-dyn-bad.d new file mode 100644 index 0000000..6e111c6e --- /dev/null +++ b/ld/testsuite/ld-aarch64/emit-relocs-259-dyn-bad.d @@ -0,0 +1,4 @@ +#name: R_AARCH64_ABS16 shared library test +#source: emit-relocs-259.s +#ld: -shared +#error: .*: relocation R_AARCH64_ABS16 against `dummy' can not be used when making a shared object; recompile with -fPIC diff --git a/ld/testsuite/ld-aarch64/emit-relocs-259.s b/ld/testsuite/ld-aarch64/emit-relocs-259.s new file mode 100644 index 0000000..7e1ba3c --- /dev/null +++ b/ld/testsuite/ld-aarch64/emit-relocs-259.s @@ -0,0 +1,6 @@ +.text + + ldr x0, .L1 + +.L1: + .hword dummy diff --git a/ld/testsuite/ld-aarch64/gc-relocs-257.s b/ld/testsuite/ld-aarch64/gc-relocs-257.s index dcc9db1..f57f9c6 100644 --- a/ld/testsuite/ld-aarch64/gc-relocs-257.s +++ b/ld/testsuite/ld-aarch64/gc-relocs-257.s @@ -1,8 +1,10 @@ .text - .word tempy + and x0, x0, x0 + and x0, x0, #0x1 .xword tempy2 + + .data + .word tempy .hword tempy3 .hword tempy3+8 - and x0, x0, x0 - and x0, x0, #0x1 --------------030407090001060008080808--