From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp.CeBiTec.Uni-Bielefeld.DE (smtp.CeBiTec.Uni-Bielefeld.DE [129.70.160.84]) by sourceware.org (Postfix) with ESMTPS id 4063E3858D28 for ; Tue, 17 Jan 2023 11:25:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4063E3858D28 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=CeBiTec.Uni-Bielefeld.DE Authentication-Results: sourceware.org; spf=none smtp.mailfrom=cebitec.uni-bielefeld.de Received: from localhost (localhost [127.0.0.1]) by smtp.CeBiTec.Uni-Bielefeld.DE (Postfix) with ESMTP id 0063B14216; Tue, 17 Jan 2023 12:25:25 +0100 (CET) X-Virus-Scanned: amavisd-new at CeBiTec.Uni-Bielefeld.DE Received: from smtp.CeBiTec.Uni-Bielefeld.DE ([127.0.0.1]) by localhost (smtp.cebitec.uni-bielefeld.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 85dEKN0Lc1ZF; Tue, 17 Jan 2023 12:25:24 +0100 (CET) Received: from manam.CeBiTec.Uni-Bielefeld.DE (p508548b7.dip0.t-ipconnect.de [80.133.72.183]) (Authenticated sender: ro) by smtp.CeBiTec.Uni-Bielefeld.DE (Postfix) with ESMTPSA id 2EF49140C2; Tue, 17 Jan 2023 12:25:24 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=CeBiTec.Uni-Bielefeld.DE; s=20200306; t=1673954724; bh=MD2nNFEHkvczU/GReYG+mid3XfSoLfe3UxVgYJMsOe8=; h=From:To:Cc:Subject:Date:From; b=boVGuiSe37GXFWB0noZNAjDEnkjK4Ne0vDJ5K41xlOxatgj6M0EeyYJ9FZCY8p5Zy jxpmYk0G3GuW/HFAIA4Ty9VwqBev/5hW0MJu/jJ6HGO6OvFE+3+2e5qap6d+M0U4Gq 4pGVXyZtWBnBWup6qZl1EyTyqifwuitdTmGt75XcCkbsL0CVsjgEpV9fl2PDA4ErXg XAjF7UYtnRyq+XmYMCIfU4xh/kMPJFqFIN5Vv38i4RmtzQQK/xZg4hzAR5CkEzNq2P DVYS3NLW3IFC+62M1iphjyZ+i6fLoVfxe95raNAAJbKwiPY+f2XxP7lTXuV4vW0UMt YZ5gAFARim34Q== From: Rainer Orth To: binutils@sourceware.org Cc: hjl.tools@gmail.com Subject: [PATCH] i386: Don't emit unsupported TLS relocs on Solaris [PR13671] Date: Tue, 17 Jan 2023 12:25:23 +0100 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1.90 (usg-unix-v) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Status: No, score=-3794.4 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,GIT_PATCH_0,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 List-Id: --=-=-= Content-Type: text/plain As detailed in PR ld/13671, gld can emit R_386_TLS_TPOFF32 relocs which the Solaris/x86 ld.so.1 doesn't know about, so the resulting executables won't run. The following patch, which H.J. provided in the PR, fixes this. Tested on i386-pc-solaris2.11 (both with the binutils testsuite and a full gcc bootstrap) and i686-pc-linux-gnu. Already approved by H.J. in the PR, but it's probably best if someone double-checks the ChangeLog entry. Rainer -- ----------------------------------------------------------------------------- Rainer Orth, Center for Biotechnology, Bielefeld University 2023-01-17 H.J. Lu bfd: PR ld/13671 * elf32-i386.c (elf_i386_tls_transition): Only emit R_386_TLS_LE, R_386_TLS_IE on Solaris. (elf_i386_relocate_section): Only use R_386_TLS_GD->R_386_TLS_LE transition on Solaris. --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=local.patch6 diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -1062,6 +1062,7 @@ elf_i386_tls_transition (struct bfd_link unsigned int from_type = *r_type; unsigned int to_type = from_type; bool check = true; + unsigned int to_le_type, to_ie_type; /* Skip TLS transition for functions. */ if (h != NULL @@ -1069,6 +1070,18 @@ elf_i386_tls_transition (struct bfd_link || h->type == STT_GNU_IFUNC)) return true; + if (get_elf_backend_data (abfd)->target_os == is_solaris) + { + /* NB: Solaris only supports R_386_TLS_LE and R_386_TLS_IE. */ + to_le_type = R_386_TLS_LE; + to_ie_type = R_386_TLS_IE; + } + else + { + to_le_type = R_386_TLS_LE_32; + to_ie_type = R_386_TLS_IE_32; + } + switch (from_type) { case R_386_TLS_GD: @@ -1080,10 +1093,10 @@ elf_i386_tls_transition (struct bfd_link if (bfd_link_executable (info)) { if (h == NULL) - to_type = R_386_TLS_LE_32; + to_type = to_le_type; else if (from_type != R_386_TLS_IE && from_type != R_386_TLS_GOTIE) - to_type = R_386_TLS_IE_32; + to_type = to_ie_type; } /* When we are called from elf_i386_relocate_section, there may @@ -1093,7 +1106,7 @@ elf_i386_tls_transition (struct bfd_link unsigned int new_to_type = to_type; if (TLS_TRANSITION_IE_TO_LE_P (info, h, tls_type)) - new_to_type = R_386_TLS_LE_32; + new_to_type = to_le_type; if (to_type == R_386_TLS_GD || to_type == R_386_TLS_GOTDESC @@ -1102,7 +1115,7 @@ elf_i386_tls_transition (struct bfd_link if (tls_type == GOT_TLS_IE_POS) new_to_type = R_386_TLS_GOTIE; else if (tls_type & GOT_TLS_IE) - new_to_type = R_386_TLS_IE_32; + new_to_type = to_ie_type; } /* We checked the transition before when we were called from @@ -1116,7 +1129,7 @@ elf_i386_tls_transition (struct bfd_link case R_386_TLS_LDM: if (bfd_link_executable (info)) - to_type = R_386_TLS_LE_32; + to_type = to_le_type; break; default: @@ -2024,6 +2037,7 @@ elf_i386_relocate_section (bfd *output_b Elf_Internal_Rela *wrel; Elf_Internal_Rela *relend; bool is_vxworks_tls; + unsigned expected_tls_le; unsigned plt_entry_size; /* Skip if check_relocs or scan_relocs failed. */ @@ -2853,9 +2867,17 @@ elf_i386_relocate_section (bfd *output_b relend, h, r_symndx, true)) return false; - if (r_type_tls == R_386_TLS_LE_32) + expected_tls_le = htab->elf.target_os == is_solaris + ? R_386_TLS_LE : R_386_TLS_LE_32; + if (r_type_tls == expected_tls_le) { - BFD_ASSERT (! unresolved_reloc); + /* NB: Solaris only supports R_386_TLS_GD->R_386_TLS_LE. */ + BFD_ASSERT (! unresolved_reloc + && (htab->elf.target_os != is_solaris + || (htab->elf.target_os == is_solaris + && (r_type == R_386_TLS_GD + || r_type == R_386_TLS_IE + || r_type == R_386_TLS_GOTIE)))); if (r_type == R_386_TLS_GD) { unsigned int type; @@ -3352,7 +3374,9 @@ elf_i386_relocate_section (bfd *output_b into: movl %gs:0, %eax leal 0(%esi), %esi */ - BFD_ASSERT (r_type == R_386_TLS_LE_32); + expected_tls_le = htab->elf.target_os == is_solaris + ? R_386_TLS_LE : R_386_TLS_LE_32; + BFD_ASSERT (r_type == expected_tls_le); if (*(contents + rel->r_offset + 4) == 0xff || *(contents + rel->r_offset + 4) == 0x67) memcpy (contents + rel->r_offset - 2, --=-=-=--