Received: by 2002:a05:6a10:413:0:0:0:0 with SMTP id 19csp1644411pxp; Thu, 17 Mar 2022 13:28:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzxg9y7bIwIQGFzsIa/EmQyyS8DcC5ic6YBCTh3Gx7GjNc/cWFvM0LQlcpY24hO1u3JdJSm X-Received: by 2002:a17:902:cccb:b0:14d:ae35:1a81 with SMTP id z11-20020a170902cccb00b0014dae351a81mr6974652ple.137.1647548895315; Thu, 17 Mar 2022 13:28:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647548895; cv=none; d=google.com; s=arc-20160816; b=lHKG3rveQG6AvyRQDdv9iKxpsgJjQbIy1KO+yZNOsxFuxP83atV+5NjNi25OKIFDPc v7us/exBtzoPfAUtUyQyF8XJVx5TkifAcEENpkzLnaN5y5DtASt7s92CcGy6OS+ob2l0 guIQhnI7bgJi//tkh+Wr9QhorSKfEs4dxUCRp1tJErMca11k/hEgGpzXUyUQ8l4CF9kv 4IjW5pcGaJE8kX8gVNTxnCklQvm8CJQoPCTHLiff4hpMILvCTrd+Bw3llkdHVim7yLaa gcjnFddNFYVMXnT91fgNhbw5mrxBkgJZA3plt6Uvx2bB8YvKquVwsdq543A1/p4yoaxH FcEw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=U0pGpjNl5p9yw1nPBoR4dr1o8lG0dXlJOR1k7q80w/I=; b=xxcP4DutPsAqUkQeNe5qW3QWT8LtO+o6/Af381WrJAfZseGNTrDRo1lTVyUku3VP4e WRWSuy8PwX9Yl2//kRYPMDus5AgpzddPGovXS9Y82zpQpwltfIjA86HoR7Czr+ksr9PV /xHrA90+b2nUSY01yjtkYOxi2J/IE0FY0Yn+rcTAHbPfdPCbchYjeKYEfOYFo/eQQ7kG iaSH/vQsvIDERxgbJtVQhyDJnMMuqapj8p4O/eE0IjvhbrK3EGmr5Ka+cwbADJy+/TxS iHnmHs0X7j+IIL5EwV60MIRhiXlROXSAVjm72090Wwz5rtFXxnjv8YsgQv2mE8GAbpRp O6jQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=F4PTAJb5; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id 81-20020a630454000000b0038224e017a4si1168799pge.508.2022.03.17.13.28.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Mar 2022 13:28:15 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=F4PTAJb5; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 0FE592BD948; Thu, 17 Mar 2022 13:03:47 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237374AbiCQSOQ (ORCPT + 99 others); Thu, 17 Mar 2022 14:14:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34448 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237367AbiCQSOD (ORCPT ); Thu, 17 Mar 2022 14:14:03 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 54812220FD1; Thu, 17 Mar 2022 11:12:19 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 2BDA96168D; Thu, 17 Mar 2022 18:12:19 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id BC441C340E9; Thu, 17 Mar 2022 18:12:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1647540738; bh=eQW2ATffmvkt9gCu0ENmX99Cst240SX3xWPmhSKl83M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=F4PTAJb5T6l/Dni/ESRCNfw6Z6FnsJhXtdSM2mkYhVh6uH77yAzySyUVUnz56G2FA ZfBpTDUTf6g9FQjBD5VKHIy5gIE52VkBd3MtAeaMxIUxGfUnzqnvQJvZFvlSx+62hn fLHkEvN+7+3lEu+++xXt0kQ5IXGiR4WcsHj9epC/gkoQbHx3ESaVm2/sp+cbUrbi4j EH/QGcN1VWqOzvFGM19/N4gWvDTZqpmegcbWTjYvTJ0zkgLs0nznS88Mvu87ClLTFh E1CWIfkph/9+gwLaVGL0TyRQEzknqbnlgHCUNjAaHAlgztTd+CaCo7XIiBaGbgy/DP rgWJ6OtYZrpVQ== From: Miguel Ojeda To: Linus Torvalds , Greg Kroah-Hartman Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Miguel Ojeda , Alex Gaynor , Wedson Almeida Filho Subject: [PATCH v5 14/20] scripts: decode_stacktrace: demangle Rust symbols Date: Thu, 17 Mar 2022 19:10:02 +0100 Message-Id: <20220317181032.15436-15-ojeda@kernel.org> In-Reply-To: <20220317181032.15436-1-ojeda@kernel.org> References: <20220317181032.15436-1-ojeda@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-3.8 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,MAILING_LIST_MULTI, RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Recent versions of both Binutils (`c++filt`) and LLVM (`llvm-cxxfilt`) provide Rust v0 mangling support. Co-developed-by: Alex Gaynor Signed-off-by: Alex Gaynor Co-developed-by: Wedson Almeida Filho Signed-off-by: Wedson Almeida Filho Signed-off-by: Miguel Ojeda --- I would like to use this patch for discussing the demangling topic. The following discusses the different approaches we could take. # Leave demangling to userspace This is the easiest and less invasive approach, the one implemented by this patch. The `decode_stacktrace.sh` script is already needed to map the offsets to the source code. Therefore, we could also take the chance to demangle the symbols here. With this approach, we do not need to introduce any change in the `vsprintf` machinery and we minimize the risk of breaking user tools. Note that, if we take this approach, it is likely we want to ask for a minimum version of either of the tools (since there may be users of the script that do not have recent enough toolchains). # Demangling in kernelspace on-the-fly That is, at backtrace print time, we demangle the Rust symbols. The size of the code that would be needed is fairly small; around 5 KiB using the "official" library (written in Rust), e.g.: text data bss dec hex filename 7799976 1689820 2129920 11619716 b14d84 vmlinux 7801111 1693916 2129920 11624947 b161f3 vmlinux + demangling We can remove a few bits from the official library, e.g. punycode support that we do not need (all our identifiers will be ASCII), but it does not make a substantial difference. The official library performs the demangling without requiring allocations. However, of course, it will increased our stack usage and complexity, specially considering a stack dump may be requested in not ideal conditions. Furthermore, this approach (and the ones below) likely require adding a new `%p` specifier (or a new modifier to existing ones) if we do not want to affect non-backtrace uses of the `B`/`S` ones. Also, it is unclear whether we should write the demangled versions in an extra, different line or replace the real symbol -- we could be breaking user tools relying on parsing backtraces (e.g. our own `decode_stacktrace.sh`). For instance, they could be relying on having real symbols there, or may break due to e.g. spaces. # Demangling at compile-time This implies having kallsyms demangle all the Rust symbols. The size of this data is around the same order of magnitude of the non-demangled ones. However, this is notably more than the demangling code (see previous point), e.g. 120 KiB (uncompressed) in a small kernel. This approach also brings the same concerns regarding modifying the backtrace printing (see previous point). # Demangling at compile-time and substituting symbols by hashes One variation of the previous alternative is avoiding the mangled names inside the kernel, by hashing them. This would avoid having to support "big symbols" and would also reduce the size of the kallsyms tables, while still allowing to link modules. However, if we do not have the real symbols around, then we do not have the possibility of providing both the mangled and demangled versions in the backtrace, which brings us back to the issues related to breaking userspace tools. There are also other places other than backtraces using "real" symbols that users may be relying on, such as `/proc/*/stack`. scripts/decode_stacktrace.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/scripts/decode_stacktrace.sh b/scripts/decode_stacktrace.sh index 5fbad61fe490..f3c7b506d440 100755 --- a/scripts/decode_stacktrace.sh +++ b/scripts/decode_stacktrace.sh @@ -8,6 +8,14 @@ usage() { echo " $0 -r | [|auto] []" } +# Try to find a Rust demangler +if type llvm-cxxfilt >/dev/null 2>&1 ; then + cppfilt=llvm-cxxfilt +elif type c++filt >/dev/null 2>&1 ; then + cppfilt=c++filt + cppfilt_opts=-i +fi + if [[ $1 == "-r" ]] ; then vmlinux="" basepath="auto" @@ -169,6 +177,12 @@ parse_symbol() { # In the case of inlines, move everything to same line code=${code//$'\n'/' '} + # Demangle if the name looks like a Rust symbol and if + # we got a Rust demangler + if [[ $name =~ ^_R && $cppfilt != "" ]] ; then + name=$("$cppfilt" "$cppfilt_opts" "$name") + fi + # Replace old address with pretty line numbers symbol="$segment$name ($code)" } -- 2.35.1