Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp2764874pxb; Mon, 17 Jan 2022 05:24:28 -0800 (PST) X-Google-Smtp-Source: ABdhPJyW4Z3X3ShaKXoyl3nVXRrbcqEp1PpjtFAowSa5J97GOhDuFYLSq5DL6yUvB+5cC2yRnIvD X-Received: by 2002:a17:902:6ac4:b0:14a:b3e8:6a14 with SMTP id i4-20020a1709026ac400b0014ab3e86a14mr6153702plt.163.1642425868398; Mon, 17 Jan 2022 05:24:28 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642425868; cv=none; d=google.com; s=arc-20160816; b=CJv4mwtK1NwbNYlCREItOYKJjHzFLFR3sBnqWMs7hoEE0nfcTT5bd2bn71FmBQM21s ZeGjq+Bk5NvLk5Ri5/UocaDsu8p6YLM9ovMDl4noEAOkpO96KvOkGn9cYkTgLhhiCAYJ z7dl2WXvJkgfLJfda7bHGqLBiZI9Ky51Pq3XRXwqWT7vENjO+JOzGLGOGTkLoN4CPcJt PKIYn8eCqJpq0Y5njw7sfDWgy7ZMUwoN4M7fSW3BmwmAnzCThxtK9E2fG/eGenpczlqE akMhVnVwJ4QafoYQxcAYCbBUaQpYfOvGICCOPMPTrK9iMm9ZiJf+0OaGctSHx6iYdQRv rNXw== 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=ebk/5VhbBE5x4MPzVw+5nt7c4NiqYU/4q9GSKtu1i/M=; b=yHnop/m0p2Nf7Z8tyk8vfgjb+ICDEUDXpZ3jUXZ00I55sJCIvrc8X1qC3wLVVM4H0d s//pY0eWDHWGe4k7nfU3alWLF+gxmAT6QnkywjfJPZFMCYTyJT4R9kqhxNSto8JxhFrf g4rI6suQztk1Rk1YJVqnecHjcDaCP0F3Uq5GSCVjIMp4lDCqW82MdQVZCYXYryeM71fv xS9KuelO62u2a+ow7eNCDBe4Nf7I/x+08IiHn+olBszXXZDFM9XdKCGx3ChBex7AG5WA SPUhMM75ti7GnvG455F9bYAY7rer7yiwDM/oFmzBu7oBNkghdpJheXIiM7p3SwtVmTMK 2IZg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=XuDRUFby; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.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 vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id 84si8498913pgh.114.2022.01.17.05.24.15; Mon, 17 Jan 2022 05:24:28 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=XuDRUFby; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.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: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230217AbiAQFfo (ORCPT + 99 others); Mon, 17 Jan 2022 00:35:44 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56838 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234286AbiAQFeu (ORCPT ); Mon, 17 Jan 2022 00:34:50 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BCC03C061748; Sun, 16 Jan 2022 21:34:47 -0800 (PST) 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 59B8260DFD; Mon, 17 Jan 2022 05:34:47 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id EB7F2C36AE3; Mon, 17 Jan 2022 05:34:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1642397686; bh=660KmN6q7qWGlybq96f1DibdDXHtCYI1EONhUalIkJI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XuDRUFbyfx+brSqoKjKlKzziB6UqhYz1wuKc+Z2B68v+ORv4yD3alqcq43y+JXn2m yFAiCMgyyKpWp6pLgfYuj/qLgvUZeoA2MQ9Ga1YZ1f9+DtfiIuMVw0ITnlRuexSvAN PZ4cLXXqQBt5e5TuEqippNbol4zic7mZpcO9pER9albWwoUQJh4oE8Zzuo63icTMX4 Eii7iwXKBUggI80gSfq68xrKKZrJIU9wqJiCSCkvclKvxAws1Z2FKLsRnnvV6gFTbT ShfNfi0B2EWgQqGMmidcc0niv/PY4WTkaBBVTKdckjqrf3/bSJk6e11ZWD81wIyrJ/ 5JRga+ElvOOFA== From: Miguel Ojeda To: Linus Torvalds , Greg Kroah-Hartman Cc: rust-for-linux@vger.kernel.org, linux-kbuild@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Miguel Ojeda , Alex Gaynor , Wedson Almeida Filho Subject: [PATCH v3 13/19] scripts: decode_stacktrace: demangle Rust symbols Date: Mon, 17 Jan 2022 06:33:43 +0100 Message-Id: <20220117053349.6804-14-ojeda@kernel.org> In-Reply-To: <20220117053349.6804-1-ojeda@kernel.org> References: <20220117053349.6804-1-ojeda@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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.34.1