From patchwork Fri Jul 22 09:29:12 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rainer Orth X-Patchwork-Id: 120 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f503:0:0:0:0:0 with SMTP id q3csp147254wro; Fri, 22 Jul 2022 02:29:49 -0700 (PDT) X-Google-Smtp-Source: AGRyM1tWzz60ZDw3O+5WqkYF5giR1sC/ohRT9luZcWQJaOnVHvFpKFwI4sZJm2Qv1geqf/SCpjh0 X-Received: by 2002:a17:907:d9e:b0:72b:394b:ad34 with SMTP id go30-20020a1709070d9e00b0072b394bad34mr2534666ejc.109.1658482188858; Fri, 22 Jul 2022 02:29:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1658482188; cv=none; d=google.com; s=arc-20160816; b=HafT6v7W2ri27xFgftFx/TjUhYsYYcNFjQA7TpqESMLgMelVhSkMpsP2NVKT/wcpyv KoMpm9O+sOwBRJrBQyQN1xa0y4pLnZPcbNfbJcExC5pnjleeHbBj1bVamX2J2U0Ul5V2 rNC8hErDIE17WJX6hXI/bb4Gdue2MslJDyj5n+zJlId5jJ1jYZZepVWaOJnhTTe6/XCf nUu4b6ViaGArxC2QtG49uqJPSpZJlR2MO9AcJLofaNJUvIFOYvC7XVAsA0ILvS1F5pS8 zu9awZTC4SMyGyr8OU1kAboJ663ocPmmuIUnSOMczKbIaYStOZDHZLYvzVamBeZ0P8Rv 6UWQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:mime-version:user-agent :message-id:date:subject:to:from:dkim-signature:dmarc-filter :delivered-to; bh=pJd55nauERxqLkhNE7E8LONdYsa/9PMBWBeYremBKC8=; b=fn6ly0m6w4fIhQ9xEz3U9w7cwg4jh9rcwInAUP4SzBDp7EtsENbuJzmH+b8gugzC2W lDF8Y756LUsg//aTXUVtRse3cVwlGCzXNTRqujv3zBjWzFf/RG3NkuUSi6RwzgxRXbtU 3RGcPi8sewAVflGQBq+QVj3Cpxd+S57tWfNCL27e3xG0ni4MmaFl8Cq9GprzYXrt/IyV lOF4aOleVuVvjmY+QCMxRXxY7zOMFsF0eoNgChPkUgIuwrdmwRMJOvAsEW4Cg6mPPeA0 MzND/u18POiEdh0tEmOLz81LJieFJSbjauRVPnV9EhXH+NR+ADYCIHQDlexnR56ue5zE wfrw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@CeBiTec.Uni-Bielefeld.DE header.s=20200306 header.b=Z8BsWKup; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from sourceware.org (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id i12-20020aa7dd0c000000b0043a7384a858si4055036edv.299.2022.07.22.02.29.48 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Jul 2022 02:29:48 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@CeBiTec.Uni-Bielefeld.DE header.s=20200306 header.b=Z8BsWKup; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 77C47383543B for ; Fri, 22 Jul 2022 09:29:43 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp.CeBiTec.Uni-Bielefeld.DE (smtp.CeBiTec.Uni-Bielefeld.DE [129.70.160.84]) by sourceware.org (Postfix) with ESMTPS id E390E3857C5D for ; Fri, 22 Jul 2022 09:29:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E390E3857C5D 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 46AC664BD9; Fri, 22 Jul 2022 11:29:14 +0200 (CEST) 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 GQU7h7xZOBlj; Fri, 22 Jul 2022 11:29:13 +0200 (CEST) Received: from manam.CeBiTec.Uni-Bielefeld.DE (p508547b6.dip0.t-ipconnect.de [80.133.71.182]) (Authenticated sender: ro) by smtp.CeBiTec.Uni-Bielefeld.DE (Postfix) with ESMTPSA id 1DC36C7673; Fri, 22 Jul 2022 11:29:13 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=CeBiTec.Uni-Bielefeld.DE; s=20200306; t=1658482153; bh=+aN2hcbC8gTwtxRZTV7i5ZMByaNz4vVfUPfX051FJsA=; h=From:To:Cc:Subject:Date:From; b=Z8BsWKupz+C5LWFkBuJp7QPyVVkwYMOTKl7Aa+RQZnBQ1zTlVypfq1Japr9BMP67C RK8fCILW54BghStUyJgc3MpAuQxyCv8pXtsrCng7Bc/GQJ7mXBqcaZIvGsoHaUobtO Q7mARL6sEJ2hVTeBjUs57DkxbCMtsLQJvNCcAVfDIKhHy72MkelyFCziNxYYAOBADv mAZoLuIMutZbLEgt1oS3pBUaq3VZoYxog6CqCDEq8QBD6VmaFghiEA8PrriFTWPFnb hdhSC63aQ+Vr4UuI8N4X7xXfb6MoS8yS8xLWw/4XCdTcHcyUvcqfZrrKHTfymEUhYs qnqqSP+5w+W1Q== From: Rainer Orth To: gcc-patches@gcc.gnu.org Subject: [PATCH] libsanitizer: Fix Solaris 11.3 compilation [PR105531] Date: Fri, 22 Jul 2022 11:29:12 +0200 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1.90 (usg-unix-v) MIME-Version: 1.0 X-Spam-Status: No, score=-3794.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, GIT_PATCH_0, KAM_ASCII_DIVIDERS, KAM_SHORT, SPF_HELO_NONE, SPF_NONE, TXREP, URIBL_BLACK autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jakub Jelinek Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1739044619798069566?= X-GMAIL-MSGID: =?utf-8?q?1739044619798069566?= The libsanitizer build has been broken on Solaris 11.3 by the latest import. An upstream patch to fix this has now been committed: [sanitizer_common] Support Solaris < 11.4 in GetStaticTlsBoundary https://reviews.llvm.org/D120059 I'd like to cherry-pick it into libsanitizer, too. Bootstrapped without regressions on sparc-sun-solaris2.11, i386-pc-solaris2.11 (both Solaris 11.3 and 11.4), and x86_64-pc-linux-gnu. Ok for trunk? Rainer # HG changeset patch # Parent 755774c20b0c4c41572195333c097be29d392b53 libsanitizer: Fix Solaris 11.3 compilation [PR105531] diff --git a/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp b/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp --- a/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp +++ b/libsanitizer/sanitizer_common/sanitizer_linux_libcdep.cpp @@ -27,6 +27,7 @@ #include "sanitizer_linux.h" #include "sanitizer_placement_new.h" #include "sanitizer_procmaps.h" +#include "sanitizer_solaris.h" #if SANITIZER_NETBSD #define _RTLD_SOURCE // for __lwp_gettcb_fast() / __lwp_getprivate_fast() @@ -62,6 +63,7 @@ #endif #if SANITIZER_SOLARIS +#include #include #include #endif @@ -350,19 +352,43 @@ static uptr TlsGetOffset(uptr ti_module, extern "C" void *__tls_get_addr(size_t *); #endif +static size_t main_tls_modid; + static int CollectStaticTlsBlocks(struct dl_phdr_info *info, size_t size, void *data) { - if (!info->dlpi_tls_modid) + size_t tls_modid; +#if SANITIZER_SOLARIS + // dlpi_tls_modid is only available since Solaris 11.4 SRU 10. Use + // dlinfo(RTLD_DI_LINKMAP) instead which works on all of Solaris 11.3, + // 11.4, and Illumos. The tlsmodid of the executable was changed to 1 in + // 11.4 to match other implementations. + if (size >= offsetof(dl_phdr_info_test, dlpi_tls_modid)) + main_tls_modid = 1; + else + main_tls_modid = 0; + g_use_dlpi_tls_data = 0; + Rt_map *map; + dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &map); + tls_modid = map->rt_tlsmodid; +#else + main_tls_modid = 1; + tls_modid = info->dlpi_tls_modid; +#endif + + if (tls_modid < main_tls_modid) return 0; - uptr begin = (uptr)info->dlpi_tls_data; + uptr begin; +#if !SANITIZER_SOLARIS + begin = (uptr)info->dlpi_tls_data; +#endif if (!g_use_dlpi_tls_data) { // Call __tls_get_addr as a fallback. This forces TLS allocation on glibc // and FreeBSD. #ifdef __s390__ begin = (uptr)__builtin_thread_pointer() + - TlsGetOffset(info->dlpi_tls_modid, 0); + TlsGetOffset(tls_modid, 0); #else - size_t mod_and_off[2] = {info->dlpi_tls_modid, 0}; + size_t mod_and_off[2] = {tls_modid, 0}; begin = (uptr)__tls_get_addr(mod_and_off); #endif } @@ -370,7 +396,7 @@ static int CollectStaticTlsBlocks(struct if (info->dlpi_phdr[i].p_type == PT_TLS) { static_cast *>(data)->push_back( TlsBlock{begin, begin + info->dlpi_phdr[i].p_memsz, - info->dlpi_phdr[i].p_align, info->dlpi_tls_modid}); + info->dlpi_phdr[i].p_align, tls_modid}); break; } return 0; @@ -382,11 +408,11 @@ static int CollectStaticTlsBlocks(struct dl_iterate_phdr(CollectStaticTlsBlocks, &ranges); uptr len = ranges.size(); Sort(ranges.begin(), len); - // Find the range with tls_modid=1. For glibc, because libc.so uses PT_TLS, - // this module is guaranteed to exist and is one of the initially loaded - // modules. + // Find the range with tls_modid == main_tls_modid. For glibc, because + // libc.so uses PT_TLS, this module is guaranteed to exist and is one of + // the initially loaded modules. uptr one = 0; - while (one != len && ranges[one].tls_modid != 1) ++one; + while (one != len && ranges[one].tls_modid != main_tls_modid) ++one; if (one == len) { // This may happen with musl if no module uses PT_TLS. *addr = 0; diff --git a/libsanitizer/sanitizer_common/sanitizer_solaris.h b/libsanitizer/sanitizer_common/sanitizer_solaris.h new file mode 100644 --- /dev/null +++ b/libsanitizer/sanitizer_common/sanitizer_solaris.h @@ -0,0 +1,56 @@ +//===-- sanitizer_solaris.h -------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file is a part of Sanitizer runtime. It contains Solaris-specific +// definitions. +// +//===----------------------------------------------------------------------===// + +#ifndef SANITIZER_SOLARIS_H +#define SANITIZER_SOLARIS_H + +#include "sanitizer_internal_defs.h" + +#if SANITIZER_SOLARIS + +#include + +namespace __sanitizer { + +// Beginning of declaration from OpenSolaris/Illumos +// $SRC/cmd/sgs/include/rtld.h. +struct Rt_map { + Link_map rt_public; + const char *rt_pathname; + ulong_t rt_padstart; + ulong_t rt_padimlen; + ulong_t rt_msize; + uint_t rt_flags; + uint_t rt_flags1; + ulong_t rt_tlsmodid; +}; + +// Structure matching the Solaris 11.4 struct dl_phdr_info used to determine +// presence of dlpi_tls_modid field at runtime. Cf. Solaris 11.4 +// dl_iterate_phdr(3C), Example 2. +struct dl_phdr_info_test { + ElfW(Addr) dlpi_addr; + const char *dlpi_name; + const ElfW(Phdr) * dlpi_phdr; + ElfW(Half) dlpi_phnum; + u_longlong_t dlpi_adds; + u_longlong_t dlpi_subs; + size_t dlpi_tls_modid; + void *dlpi_tls_data; +}; + +} // namespace __sanitizer + +#endif // SANITIZER_SOLARIS + +#endif // SANITIZER_SOLARIS_H