From patchwork Sun May 24 05:06:44 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 135515 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 73EDB4BAD16F for ; Sun, 24 May 2026 05:08:02 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 73EDB4BAD16F Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20251104 header.b=duaf81NH X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pj1-x1030.google.com (mail-pj1-x1030.google.com [IPv6:2607:f8b0:4864:20::1030]) by sourceware.org (Postfix) with ESMTPS id 9AB784BAD16D for ; Sun, 24 May 2026 05:07:22 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 9AB784BAD16D Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 9AB784BAD16D Authentication-Results: sourceware.org; arc=pass smtp.remote-ip=2607:f8b0:4864:20::1030 ARC-Seal: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1779599242; cv=pass; b=Sf02wAp1LRna9ItvuuH3xMlIAbgkpuLIA6OpSvewyyXt+oM5gB4g5CPRQJVujhS+DEk+J0VYD5hQJexl3FDSl00RwxeSStL4N8gqZUvfG6Zh1k9pVHdgpC3kdKv8Ty8UHAramOhiaFdWehIox0nwcoN9J6NKRAVXWGrZ+Tuff+c= ARC-Message-Signature: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1779599242; c=relaxed/simple; bh=ilb6kCd6FKO1yuTJxVbxwj7B3w4uo2LVYKorTPg6vAc=; h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To; b=dJPqPacDV5mM4s+VZmtL+/MX99ir2S/X2LcAMJNLROHlcVNPRiqM/Q8YyS0pU7ghCRe7ivlhaRdkK5RjvTPE17jJV8+2G69r/+JBG7QdCzCiXj5ADniTr2aFUeBB8HGzh95CEo08hXwXQmTb792Lbe+0U+NuOsNm+4sXCt4dGiI= ARC-Authentication-Results: i=2; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20251104 header.b=duaf81NH DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9AB784BAD16D Received: by mail-pj1-x1030.google.com with SMTP id 98e67ed59e1d1-367cbac9c37so4943536a91.2 for ; Sat, 23 May 2026 22:07:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1779599241; cv=none; d=google.com; s=arc-20240605; b=Pi07aHSX8st4i7fWBjQ1UAezitHOsD1HYvP+Ghf1vDL45USNUonveIxiwvo3DUvhGA RPs1UHZ8u9KYPQUjQfi9/Ujl2W2lsasBgd7FGf/Yc/FFFUkZHgQH9h6Np3g2umsa/D2j Tljp8XX9Sc3YlKjmGikX44CbCCry9znIBSPE1WSWfF+fp5BDGn1pYLkuWdZX5K9SnX4+ kTXngKL3mODxdVi+jR6vx5N2mLKzhpDVbdfRmz1aDs7BFwhg86PvCNBj2sY3tMA63F1H SshJh3xQ+EJhBMpkyoDJdscwCxwAmm6kZbpigdCpnySNRTHt7hyY5xjKsNlFnWuW/FY5 XNBQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=UU2iM8EB399YyCKP2NfF/fUilJjxv92vB1KMz/SJcVo=; fh=I+qhSY5ktf66CLZYyuJDnoh0Kvc4/Q3NDZkgrTQ/yn8=; b=GpmyyXecsnci9Z4MzNQV9p/h7V56Ts4nm6RisAyjFugqTNx5z+6HPSPUMz/c6B+abc 9HBSmBMR1N03KCMzRbF+/JvMsBmmfOwuRWOxaA7AE38pOuMgal1/UFYBuJtVPMyDcry0 CUWgqSTCArsG39xpYCWqQ9yQM4fMfWGyJmeFxj020I1z2F5ZY+Yn0lOTx259bFulOnDx jq3Tc/41Mo6Q3jU5t4BuNwcQUWj3as1jizW4dNyNFRuADArVpdPJ8nvoFK0cY3zZYLFf 9Gq2Ct56qMoNOxFSoFsornAw7bSmOlMHuGehat+FGkDoRLptE7z5DIHt1Iq/plNSq0SK ghdA==; darn=sourceware.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779599241; x=1780204041; darn=sourceware.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=UU2iM8EB399YyCKP2NfF/fUilJjxv92vB1KMz/SJcVo=; b=duaf81NHm4zF0w8oxOjRpzV7gsG/srtwlbeGSOl2iYEc4dAs+R5FiAzU2m0gdR9USk +2WQ3GUGnrnTDV7UDMHhneS9U7lT0ck/LkC/yL4qE+VUHqyTtq6tO4tVfZfXl/H3ia8Q xqWmQXrpSIlMrRBaNOZW9QEHb5C8M/wNbMMWXshMirb7VGnGKO8+Y4IEHrhJrrqJCVQa cY48v8IyE/K7VTOP4EnjSCKkxevp/FsWqRD/a2Pcc6yTzXSUtuL82QcH/lt3aCPX/xRV nGbIFNt71UooNXHq+yRsw1CEJDrCO5aphYhsVL+U7ePYy3S1ATtKpfjhTarGjQ9tTUx7 /bag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779599241; x=1780204041; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=UU2iM8EB399YyCKP2NfF/fUilJjxv92vB1KMz/SJcVo=; b=q5oeN2RVH6T1SFZ1d3PkrnzPJ63xlwxt70OUkHwBiQu2wfyn8IwbztA4q3u8LcW40v uYSVqZ00r/tYwQokkLow0r9h9grfxmKnB8VIiuA4MRcQxJ+GrFFiDYBYb+bY4rsEIqZ8 Jp5+0byKus9BZnN+DvJmaKOIIG4HmbylopWiTBI+FaLxX+l8B8sCDe3k4RftLA8E5LMY FTa3tYInCwObvmvJKR0dWln6y5L/9Tz44DVd8+2GM8Rn5mWVLJo0BkI7EswkfO2Rze5b gJH0Vl9az8Z4gLszG9BghqaUKC60zZ3A+WxQCOSv7h81edyyw4mbSMFa84KeCLg69IeU p7fw== X-Gm-Message-State: AOJu0YxZ+nh0DUaznS22qZysxEyXnDh0LadviW20yQa+gK+lc/XiOQd8 JBfl+67EYFrM3JSb5+5TYsBN5OrIeUjctSlU2ABWOQVmWSDWuVrS+aTRg63ePyMJzxThozLIkHJ bwhMOlDJrvJAHZExMjJZEAxXxWZzkD8E= X-Gm-Gg: Acq92OHMg6w86SPDaRaSnkkoO2Z6JDkYSmekJZTQabmlat6yZaPX3DHXsaehxspwNtG itO+JnEWpihyC/VeKw+EXStq9k1qLe1Cp594Zlx0lsJjwDkWdFcpNMUiDua/gg8MieTVTC5XTsJ +vfWmO7YKzRXKH+BckFVLHzcwFkNTHCwlcoJrNdCh/TQeMKv8kNU3nv3CM4QoBD7/ARxXIPMwX3 8Rg95dZyUP/tBbRe6uT5gVEt2uEDNlnUnqPLpiIpx8wVy1FB5JBPS2tWir9WpguRAo0MDFBK31Z 952z+khV X-Received: by 2002:a17:90b:134d:b0:366:4782:138c with SMTP id 98e67ed59e1d1-36a67506a60mr8735104a91.17.1779599241419; Sat, 23 May 2026 22:07:21 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: "H.J. Lu" Date: Sun, 24 May 2026 13:06:44 +0800 X-Gm-Features: AVHnY4KVVImNeIvp8MeQtsVOIWthZa7Ogzrmjae2yKQ9vyoNdNSLeC2LLwRXiBg Message-ID: Subject: [PATCH v4] alpha: Properly handle local weak undefined symbols To: Alan Modra Cc: Binutils , Nick Clifton , Jan Beulich X-Spam-Status: No, score=-3009.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE, SPF_PASS, TXREP shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on 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 On Sun, May 24, 2026 at 11:55 AM Alan Modra wrote: > > On Sun, May 24, 2026 at 07:24:46AM +0800, H.J. Lu wrote: > > When processing TLS relocations, elf_hash_table (info)->tls_sec can be > > NULL if all TLS symbols are weak, hidden and undefined. Don't assert > > elf_hash_table (info)->tls_sec != NULL. Since the undefined TLS symbol > > address doesn't map to any TLS storage, it isn't usable. Also set > > dtp_base and tp_base to 0 if elf_hash_table (info)->tls_sec == NULL. > > > > bfd/ > > > > PR ld/34165 > > * elf64-alpha.c (elf64_alpha_relax_got_load): Set dtp_base and > > tp_base to 0 if elf_hash_table (info)->tls_sec == NULL. > > (elf64_alpha_relocate_section): Don't assert > > elf_hash_table (info)->tls_sec != NULL. > > > > ld/ > > > > PR ld/34165 > > * testsuite/ld-alpha/alpha.exp: Run $srcdir/$subdir/*.d. > > * testsuite/ld-alpha/tlsbin-undef.d: New file. > > * testsuite/ld-alpha/tlsbin-undef.s: Likewise. > > * testsuite/ld-alpha/tlsbin-weak-undef1.d: Likewise. > > * testsuite/ld-alpha/tlsbin-weak-undef1.s: Likewise. > > * testsuite/ld-alpha/tlsbin-weak-undef2.d: Likewise. > > * testsuite/ld-alpha/tlsbin-weak-undef2.s: Likewise. > > * testsuite/ld-alpha/tlspic-undef.d: Likewise. > > * testsuite/ld-alpha/tlspic-undef.s: Likewise. > > * testsuite/ld-alpha/tlspic-weak-undef1.d: Likewise. > > * testsuite/ld-alpha/tlspic-weak-undef1.s: Likewise. > > * testsuite/ld-elf/pr34165.c: Likewise. > > * testsuite/ld-elf/tls.exp: Run PR ld/34165 test. > > Thanks, this is good. aarch64-linux and ia64-linux fail the pr34165 > test, exposing similary problems in those backends. > It turns out that we need special handling for local weak undefined symbols. Otherwise, we may get relocation overflow. Here is the v4 patch to set the local undefined TLS symbol value to 0 with a new testcase. From 5d1e883ebe2e71395992ddeb6ff412d6cf5899e4 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sat, 23 May 2026 05:12:10 +0800 Subject: [PATCH v4] alpha: Properly handle local weak undefined symbols Since the local undefined TLS symbol address isn't mapped to any TLS storage, it isn't usable. Set its value to 0 to avoid relocation overflow. When processing TLS relocations, elf_hash_table (info)->tls_sec can be NULL if all TLS symbols are weak, hidden and undefined. Don't assert elf_hash_table (info)->tls_sec != NULL. Always set dtp_base and tp_base to 0 if elf_hash_table (info)->tls_sec == NULL. bfd/ PR ld/34165 * * elf-bfd.h (elf_link_local_undefweak_p): New function. * elf64-alpha.c (elf64_alpha_relax_got_load): Set dtp_base and tp_base to 0 if elf_hash_table (info)->tls_sec == NULL. (elf64_alpha_relocate_section): Set the local undefined TLS symbol value to 0. Don't assert elf_hash_table (info)->tls_sec != NULL. ld/ PR ld/34165 * testsuite/ld-alpha/alpha.exp: Run $srcdir/$subdir/*.d. * testsuite/ld-alpha/tlsbin-undef.d: New file. * testsuite/ld-alpha/tlsbin-undef.s: Likewise. * testsuite/ld-alpha/tlsbin-weak-undef1.d: Likewise. * testsuite/ld-alpha/tlsbin-weak-undef1.s: Likewise. * testsuite/ld-alpha/tlsbin-weak-undef2.d: Likewise. * testsuite/ld-alpha/tlsbin-weak-undef2.s: Likewise. * testsuite/ld-alpha/tlsbin-weak-undef3.d: Likewise. * testsuite/ld-alpha/tlsbin-weak-undef3.s: Likewise. * testsuite/ld-alpha/tlsbin-weak-undef4.d: Likewise. * testsuite/ld-alpha/tlsbin-weak-undef4.s: Likewise. * testsuite/ld-alpha/tlspic-undef.d: Likewise. * testsuite/ld-alpha/tlspic-undef.s: Likewise. * testsuite/ld-alpha/tlspic-weak-undef1.d: Likewise. * testsuite/ld-alpha/tlspic-weak-undef1.s: Likewise. * testsuite/ld-elf/pr34165.c: Likewise. * testsuite/ld-elf/tls.exp: Run PR ld/34165 test. Signed-off-by: H.J. Lu --- bfd/elf-bfd.h | 11 ++++++++ bfd/elf64-alpha.c | 33 ++++++++++++++++------ ld/testsuite/ld-alpha/alpha.exp | 7 +++++ ld/testsuite/ld-alpha/tlsbin-undef.d | 2 ++ ld/testsuite/ld-alpha/tlsbin-undef.s | 16 +++++++++++ ld/testsuite/ld-alpha/tlsbin-weak-undef1.d | 14 +++++++++ ld/testsuite/ld-alpha/tlsbin-weak-undef1.s | 17 +++++++++++ ld/testsuite/ld-alpha/tlsbin-weak-undef2.d | 14 +++++++++ ld/testsuite/ld-alpha/tlsbin-weak-undef2.s | 17 +++++++++++ ld/testsuite/ld-alpha/tlsbin-weak-undef3.d | 14 +++++++++ ld/testsuite/ld-alpha/tlsbin-weak-undef3.s | 22 +++++++++++++++ ld/testsuite/ld-alpha/tlsbin-weak-undef4.d | 14 +++++++++ ld/testsuite/ld-alpha/tlsbin-weak-undef4.s | 22 +++++++++++++++ ld/testsuite/ld-alpha/tlspic-undef.d | 2 ++ ld/testsuite/ld-alpha/tlspic-undef.s | 16 +++++++++++ ld/testsuite/ld-alpha/tlspic-weak-undef1.d | 14 +++++++++ ld/testsuite/ld-alpha/tlspic-weak-undef1.s | 22 +++++++++++++++ ld/testsuite/ld-elf/pr34165.c | 14 +++++++++ ld/testsuite/ld-elf/tls.exp | 11 ++++++++ 19 files changed, 273 insertions(+), 9 deletions(-) create mode 100644 ld/testsuite/ld-alpha/tlsbin-undef.d create mode 100644 ld/testsuite/ld-alpha/tlsbin-undef.s create mode 100644 ld/testsuite/ld-alpha/tlsbin-weak-undef1.d create mode 100644 ld/testsuite/ld-alpha/tlsbin-weak-undef1.s create mode 100644 ld/testsuite/ld-alpha/tlsbin-weak-undef2.d create mode 100644 ld/testsuite/ld-alpha/tlsbin-weak-undef2.s create mode 100644 ld/testsuite/ld-alpha/tlsbin-weak-undef3.d create mode 100644 ld/testsuite/ld-alpha/tlsbin-weak-undef3.s create mode 100644 ld/testsuite/ld-alpha/tlsbin-weak-undef4.d create mode 100644 ld/testsuite/ld-alpha/tlsbin-weak-undef4.s create mode 100644 ld/testsuite/ld-alpha/tlspic-undef.d create mode 100644 ld/testsuite/ld-alpha/tlspic-undef.s create mode 100644 ld/testsuite/ld-alpha/tlspic-weak-undef1.d create mode 100644 ld/testsuite/ld-alpha/tlspic-weak-undef1.s create mode 100644 ld/testsuite/ld-elf/pr34165.c diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 41be7232664..12ac3f362c0 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -3558,6 +3558,17 @@ bfd_section_is_ctf (const asection *sec) return startswith (name, ".ctf") && (name[4] == 0 || name[4] == '.'); } +/* Return true if H is local weak undefined. */ + +static inline bool +elf_link_local_undefweak_p (struct elf_link_hash_entry *h, + struct bfd_link_info *info) +{ + return (h != NULL + && h->root.type == bfd_link_hash_undefweak + && _bfd_elf_symbol_refs_local_p (h, info, false)); +} + #ifdef __cplusplus } #endif diff --git a/bfd/elf64-alpha.c b/bfd/elf64-alpha.c index 91cc7bcaec8..594bfe9a80e 100644 --- a/bfd/elf64-alpha.c +++ b/bfd/elf64-alpha.c @@ -3018,9 +3018,13 @@ elf64_alpha_relax_got_load (struct alpha_relax_info *info, bfd_vma symval, { bfd_vma dtp_base, tp_base; - BFD_ASSERT (elf_hash_table (info->link_info)->tls_sec != NULL); - dtp_base = alpha_get_dtprel_base (info->link_info); - tp_base = alpha_get_tprel_base (info->link_info); + if (elf_hash_table (info->link_info)->tls_sec != NULL) + { + dtp_base = alpha_get_dtprel_base (info->link_info); + tp_base = alpha_get_tprel_base (info->link_info); + } + else + dtp_base = tp_base = 0; disp = symval - (r_type == R_ALPHA_GOTDTPREL ? dtp_base : tp_base); insn = (OP_LDA << 26) | (insn & (31 << 21)) | (31 << 16); @@ -4644,10 +4648,17 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info, input_bfd, h->root.root.root.string); ret_val = false; } - BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL); - value -= tp_base; - if (r_type == R_ALPHA_TPRELHI) - value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1); + else if (elf_link_local_undefweak_p (&h->root, info)) + /* NB: The local undefined TLS symbol address isn't usable + since it isn't mapped to any TLS storage. Set it to 0 + to avoid relocation overflow. */ + value = 0; + else + { + value -= tp_base; + if (r_type == R_ALPHA_TPRELHI) + value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1); + } goto default_reloc; case R_ALPHA_GOTDTPREL: @@ -4665,8 +4676,12 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info, value = 0; else { - BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL); - if (r_type == R_ALPHA_GOTDTPREL) + if (elf_link_local_undefweak_p (&h->root, info)) + /* NB: The local undefined TLS symbol address isn't + usable since it isn't mapped to any TLS storage. + Set it to 0 to avoid relocation overflow. */ + value = 0; + else if (r_type == R_ALPHA_GOTDTPREL) value -= dtp_base; else if (bfd_link_executable (info)) value -= tp_base; diff --git a/ld/testsuite/ld-alpha/alpha.exp b/ld/testsuite/ld-alpha/alpha.exp index 540580f3e19..f6b16918927 100644 --- a/ld/testsuite/ld-alpha/alpha.exp +++ b/ld/testsuite/ld-alpha/alpha.exp @@ -69,3 +69,10 @@ set alphatests { # {{objdump -sj.debug_foobar tlsg.sd}} "tlsg"} run_ld_link_tests $alphatests + +set test_list [lsort [glob -nocomplain $srcdir/$subdir/*.d]] +foreach t $test_list { + # We need to strip the ".d", but can leave the dirname. + verbose [file rootname $t] + run_dump_test [file rootname $t] +} diff --git a/ld/testsuite/ld-alpha/tlsbin-undef.d b/ld/testsuite/ld-alpha/tlsbin-undef.d new file mode 100644 index 00000000000..203d0c424e8 --- /dev/null +++ b/ld/testsuite/ld-alpha/tlsbin-undef.d @@ -0,0 +1,2 @@ +#ld: +#error: .*: undefined reference to `x' diff --git a/ld/testsuite/ld-alpha/tlsbin-undef.s b/ld/testsuite/ld-alpha/tlsbin-undef.s new file mode 100644 index 00000000000..b95f48afd69 --- /dev/null +++ b/ld/testsuite/ld-alpha/tlsbin-undef.s @@ -0,0 +1,16 @@ + .set noreorder + .set volatile + .set noat + .set nomacro + .arch ev4 + .text + .align 4 + .globl _start + .ent _start +_start: + ldq $1,x($29) !gottprel + addq $0,$1,$0 + ret + .end _start + .hidden x + .section .note.GNU-stack,"",@progbits diff --git a/ld/testsuite/ld-alpha/tlsbin-weak-undef1.d b/ld/testsuite/ld-alpha/tlsbin-weak-undef1.d new file mode 100644 index 00000000000..a234b5e4ad1 --- /dev/null +++ b/ld/testsuite/ld-alpha/tlsbin-weak-undef1.d @@ -0,0 +1,14 @@ +#ld: -z norelro -z nomemory-seal +#objdump: -dw + +.*: +file format .* + + +Disassembly of section .text: + +[a-f0-9]+ <_start>: + +[a-f0-9]+: 00 80 3d a4 ldq t0,-32768\(gp\) + +[a-f0-9]+: 00 04 01 40 addq v0,t0,v0 + +[a-f0-9]+: 01 80 fa 6b ret + +[a-f0-9]+: 00 00 fe 2f unop +#pass diff --git a/ld/testsuite/ld-alpha/tlsbin-weak-undef1.s b/ld/testsuite/ld-alpha/tlsbin-weak-undef1.s new file mode 100644 index 00000000000..7cd447ffb6e --- /dev/null +++ b/ld/testsuite/ld-alpha/tlsbin-weak-undef1.s @@ -0,0 +1,17 @@ + .set noreorder + .set volatile + .set noat + .set nomacro + .arch ev4 + .text + .align 4 + .globl _start + .ent _start +_start: + ldq $1,x($29) !gottprel + addq $0,$1,$0 + ret + .end _start + .weak x + .hidden x + .section .note.GNU-stack,"",@progbits diff --git a/ld/testsuite/ld-alpha/tlsbin-weak-undef2.d b/ld/testsuite/ld-alpha/tlsbin-weak-undef2.d new file mode 100644 index 00000000000..47fb7336674 --- /dev/null +++ b/ld/testsuite/ld-alpha/tlsbin-weak-undef2.d @@ -0,0 +1,14 @@ +#ld: -z norelro -z nomemory-seal +#objdump: -dw + +.*: +file format .* + + +Disassembly of section .text: + +[a-f0-9]+ <_start>: + +[a-f0-9]+: 00 00 00 24 ldah v0,0\(v0\) + +[a-f0-9]+: 00 00 20 a0 ldl t0,0\(v0\) + +[a-f0-9]+: 01 80 fa 6b ret + +[a-f0-9]+: 00 00 fe 2f unop +#pass diff --git a/ld/testsuite/ld-alpha/tlsbin-weak-undef2.s b/ld/testsuite/ld-alpha/tlsbin-weak-undef2.s new file mode 100644 index 00000000000..bf05205bb59 --- /dev/null +++ b/ld/testsuite/ld-alpha/tlsbin-weak-undef2.s @@ -0,0 +1,17 @@ + .set noreorder + .set volatile + .set noat + .set nomacro + .arch ev4 + .text + .align 4 + .globl _start + .ent _start +_start: + ldah $0,x($0) !tprelhi + ldl $1,x($0) !tprello + ret + .end _start + .weak x + .hidden x + .section .note.GNU-stack,"",@progbits diff --git a/ld/testsuite/ld-alpha/tlsbin-weak-undef3.d b/ld/testsuite/ld-alpha/tlsbin-weak-undef3.d new file mode 100644 index 00000000000..a234b5e4ad1 --- /dev/null +++ b/ld/testsuite/ld-alpha/tlsbin-weak-undef3.d @@ -0,0 +1,14 @@ +#ld: -z norelro -z nomemory-seal +#objdump: -dw + +.*: +file format .* + + +Disassembly of section .text: + +[a-f0-9]+ <_start>: + +[a-f0-9]+: 00 80 3d a4 ldq t0,-32768\(gp\) + +[a-f0-9]+: 00 04 01 40 addq v0,t0,v0 + +[a-f0-9]+: 01 80 fa 6b ret + +[a-f0-9]+: 00 00 fe 2f unop +#pass diff --git a/ld/testsuite/ld-alpha/tlsbin-weak-undef3.s b/ld/testsuite/ld-alpha/tlsbin-weak-undef3.s new file mode 100644 index 00000000000..c0a5c0a5808 --- /dev/null +++ b/ld/testsuite/ld-alpha/tlsbin-weak-undef3.s @@ -0,0 +1,22 @@ + .set noreorder + .set volatile + .set noat + .set nomacro + .arch ev4 + .text + .align 4 + .globl _start + .ent _start +_start: + ldq $1,x($29) !gottprel + addq $0,$1,$0 + ret + .end _start + .section .tbss,"awT",@nobits + .type y, @object + .size y, 4 +y: + .zero 4 + .weak x + .hidden x + .section .note.GNU-stack,"",@progbits diff --git a/ld/testsuite/ld-alpha/tlsbin-weak-undef4.d b/ld/testsuite/ld-alpha/tlsbin-weak-undef4.d new file mode 100644 index 00000000000..47fb7336674 --- /dev/null +++ b/ld/testsuite/ld-alpha/tlsbin-weak-undef4.d @@ -0,0 +1,14 @@ +#ld: -z norelro -z nomemory-seal +#objdump: -dw + +.*: +file format .* + + +Disassembly of section .text: + +[a-f0-9]+ <_start>: + +[a-f0-9]+: 00 00 00 24 ldah v0,0\(v0\) + +[a-f0-9]+: 00 00 20 a0 ldl t0,0\(v0\) + +[a-f0-9]+: 01 80 fa 6b ret + +[a-f0-9]+: 00 00 fe 2f unop +#pass diff --git a/ld/testsuite/ld-alpha/tlsbin-weak-undef4.s b/ld/testsuite/ld-alpha/tlsbin-weak-undef4.s new file mode 100644 index 00000000000..0684a9cbf32 --- /dev/null +++ b/ld/testsuite/ld-alpha/tlsbin-weak-undef4.s @@ -0,0 +1,22 @@ + .set noreorder + .set volatile + .set noat + .set nomacro + .arch ev4 + .text + .align 4 + .globl _start + .ent _start +_start: + ldah $0,x($0) !tprelhi + ldl $1,x($0) !tprello + ret + .end _start + .section .tbss,"awT",@nobits + .type y, @object + .size y, 4 +y: + .zero 4 + .weak x + .hidden x + .section .note.GNU-stack,"",@progbits diff --git a/ld/testsuite/ld-alpha/tlspic-undef.d b/ld/testsuite/ld-alpha/tlspic-undef.d new file mode 100644 index 00000000000..e6907997ada --- /dev/null +++ b/ld/testsuite/ld-alpha/tlspic-undef.d @@ -0,0 +1,2 @@ +#ld: -shared +#error: .*: undefined reference to `x' diff --git a/ld/testsuite/ld-alpha/tlspic-undef.s b/ld/testsuite/ld-alpha/tlspic-undef.s new file mode 100644 index 00000000000..c4b091fc834 --- /dev/null +++ b/ld/testsuite/ld-alpha/tlspic-undef.s @@ -0,0 +1,16 @@ + .set noreorder + .set volatile + .set noat + .set nomacro + .arch ev4 + .text + .align 4 + .globl _start + .ent _start +_start: + ldq $1,x($29) !gotdtprel + addq $0,$1,$1 + ret + .end _start + .hidden x + .section .note.GNU-stack,"",@progbits diff --git a/ld/testsuite/ld-alpha/tlspic-weak-undef1.d b/ld/testsuite/ld-alpha/tlspic-weak-undef1.d new file mode 100644 index 00000000000..626da576d66 --- /dev/null +++ b/ld/testsuite/ld-alpha/tlspic-weak-undef1.d @@ -0,0 +1,14 @@ +#ld: -shared -z norelro -z nomemory-seal +#objdump: -dw + +.*: +file format .* + + +Disassembly of section .text: + +[a-f0-9]+ <_start>: + +[a-f0-9]+: 00 80 3d a4 ldq t0,-32768\(gp\) + +[a-f0-9]+: 01 04 01 40 addq v0,t0,t0 + +[a-f0-9]+: 01 80 fa 6b ret + +[a-f0-9]+: 00 00 fe 2f unop +#pass diff --git a/ld/testsuite/ld-alpha/tlspic-weak-undef1.s b/ld/testsuite/ld-alpha/tlspic-weak-undef1.s new file mode 100644 index 00000000000..bcbe5a173b3 --- /dev/null +++ b/ld/testsuite/ld-alpha/tlspic-weak-undef1.s @@ -0,0 +1,22 @@ + .set noreorder + .set volatile + .set noat + .set nomacro + .arch ev4 + .text + .align 4 + .globl _start + .ent _start +_start: + ldq $1,x($29) !gotdtprel + addq $0,$1,$1 + ret + .end _start + .section .tbss,"awT",@nobits + .type y, @object + .size y, 4 +y: + .zero 4 + .weak x + .hidden x + .section .note.GNU-stack,"",@progbits diff --git a/ld/testsuite/ld-elf/pr34165.c b/ld/testsuite/ld-elf/pr34165.c new file mode 100644 index 00000000000..3793dda4403 --- /dev/null +++ b/ld/testsuite/ld-elf/pr34165.c @@ -0,0 +1,14 @@ +extern __thread int x +__attribute__((visibility("hidden"))) +__attribute__((weak)); +extern __thread int x_used +__attribute__((visibility("hidden"))) +__attribute__((weak)); + +int +main (void) +{ + if (!x_used) + x++; + return 0; +} diff --git a/ld/testsuite/ld-elf/tls.exp b/ld/testsuite/ld-elf/tls.exp index 515824b7f12..d149c3a41df 100644 --- a/ld/testsuite/ld-elf/tls.exp +++ b/ld/testsuite/ld-elf/tls.exp @@ -62,6 +62,17 @@ run_ld_link_tests [list \ ] \ ] +run_cc_link_tests [list \ + [list \ + "pr34165" \ + "" \ + "-O2 $NOSANITIZE_CFLAGS" \ + { pr34165.c } \ + {} \ + "pr34165" \ + ] \ +] + if [file exists tmpdir/pr22263-1] { run_ld_link_tests [list \ [list \ -- 2.54.0