From: Matthew Malcomson Date: Mon, 7 Mar 2022 18:10:51 +0000 (+0000) Subject: Assign correct size on Morello TLS relocations X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bf3eaebd3420930c6454cfafe6a636d57599c318;p=thirdparty%2Fbinutils-gdb.git Assign correct size on Morello TLS relocations The previous code was not actually using the size of a symbol when the symbol was in the hash table. This meant that our TLS relaxations created an instruction sequence with bounds of zero so that the GCC TLS instruction sequence eventually ended up giving a length-zero capability. Also handle extra size of pointers in TCB for c64. For purecap we have 16 byte pointers. Hence the TCB is 32 bytes. This was not yet handled in our relaxations. Here we determine whether to use a 32 or 16 byte TCB based on the flags of the current BFD (i.e. whether this is a purecap binary that we're creating). Testcases are updated to account for the fact that the length of the capability to the symbol itself is now sometimes non-zero and for the different offset required into the TLS block for modules loaded at startup time. --- diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 06e3bd8aea2..4814e4ac06f 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -2929,7 +2929,8 @@ c64_value_p (asection *section, unsigned int value) } /* The size of the thread control block which is defined to be two pointers. */ -#define TCB_SIZE (ARCH_SIZE/8)*2 +#define TCB_SIZE(cur_bfd) \ + elf_elfheader(cur_bfd)->e_flags & EF_AARCH64_CHERI_PURECAP ? 32 : (ARCH_SIZE/8)*2 struct elf_aarch64_local_symbol { @@ -6043,7 +6044,7 @@ tpoff_base (struct bfd_link_info *info) /* If tls_sec is NULL, we should have signalled an error already. */ BFD_ASSERT (htab->tls_sec != NULL); - bfd_vma base = align_power ((bfd_vma) TCB_SIZE, + bfd_vma base = align_power ((bfd_vma) TCB_SIZE (info->output_bfd), htab->tls_sec->alignment_power); return htab->tls_sec->vma - base; } @@ -7700,7 +7701,7 @@ elfNN_aarch64_tls_relax (bfd *input_bfd, struct bfd_link_info *info, BFD_ASSERT (globals && input_bfd && contents && rel); - if (is_local) + if (is_local || !bfd_link_pic (info)) { if (h != NULL) sym_size = h->size; @@ -8106,7 +8107,7 @@ set_nop: /* No need of CALL26 relocation for tls_get_addr. */ rel[1].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE); bfd_putl32 (0xd53bd040, contents + rel->r_offset + 0); - bfd_putl32 (add_R0_R0 | (TCB_SIZE << 10), + bfd_putl32 (add_R0_R0 | (TCB_SIZE (input_bfd) << 10), contents + rel->r_offset + 4); return bfd_reloc_ok; } @@ -8135,7 +8136,7 @@ set_nop: BFD_ASSERT (ELFNN_R_TYPE (rel[1].r_info) == AARCH64_R (CALL26)); /* No need of CALL26 relocation for tls_get_addr. */ rel[1].r_info = ELFNN_R_INFO (STN_UNDEF, R_AARCH64_NONE); - bfd_putl32 (add_R0_R0 | (TCB_SIZE << 10), + bfd_putl32 (add_R0_R0 | (TCB_SIZE (input_bfd) << 10), contents + rel->r_offset + 0); bfd_putl32 (INSN_NOP, contents + rel->r_offset + 4); return bfd_reloc_ok; diff --git a/ld/testsuite/ld-aarch64/morello-tlsdesc-static.d b/ld/testsuite/ld-aarch64/morello-tlsdesc-static.d index 372f369e7a2..9026f14115b 100644 --- a/ld/testsuite/ld-aarch64/morello-tlsdesc-static.d +++ b/ld/testsuite/ld-aarch64/morello-tlsdesc-static.d @@ -14,8 +14,8 @@ Disassembly of section .text: .*: c29bd042 mrs c2, ctpidr_el0 .*: d2a00001 movz x1, #0x0, lsl #16 .*: d2a00000 movz x0, #0x0, lsl #16 -.*: f2800200 movk x0, #0x10 -.*: f2800001 movk x1, #0x0 +.*: f2800400 movk x0, #0x20 +.*: f2800081 movk x1, #0x4 .*: c2a06040 add c0, c2, x0, uxtx .*: c2c10000 scbnds c0, c0, x1 @@ -23,7 +23,7 @@ Disassembly of section .text: .*: c29bd042 mrs c2, ctpidr_el0 .*: d2a00001 movz x1, #0x0, lsl #16 .*: d2a00000 movz x0, #0x0, lsl #16 -.*: f2800280 movk x0, #0x14 +.*: f2800480 movk x0, #0x24 .*: f2800281 movk x1, #0x14 .*: c2a06040 add c0, c2, x0, uxtx .*: c2c10000 scbnds c0, c0, x1 diff --git a/ld/testsuite/ld-aarch64/morello-tlsdesc-staticpie.d b/ld/testsuite/ld-aarch64/morello-tlsdesc-staticpie.d index e391d86962c..bf2b67aa457 100644 --- a/ld/testsuite/ld-aarch64/morello-tlsdesc-staticpie.d +++ b/ld/testsuite/ld-aarch64/morello-tlsdesc-staticpie.d @@ -42,7 +42,7 @@ Disassembly of section .text: .*: c29bd042 mrs c2, ctpidr_el0 .*: d2a00001 movz x1, #0x0, lsl #16 .*: d2a00000 movz x0, #0x0, lsl #16 -.*: f2800280 movk x0, #0x14 +.*: f2800480 movk x0, #0x24 .*: f2800281 movk x1, #0x14 .*: c2....40 add c0, c2, x0, uxtx .*: c2c10000 scbnds c0, c0, x1