Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp3277875pxv; Sun, 4 Jul 2021 13:29:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz+erqFQQ1HdagOym9vzAO+V/G35+Zsqc93S19yjTYVWWVNnr+1gwZhYUMNrKDb0bMdNM7i X-Received: by 2002:a92:d443:: with SMTP id r3mr6275992ilm.242.1625430561253; Sun, 04 Jul 2021 13:29:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625430561; cv=none; d=google.com; s=arc-20160816; b=NvoeEIOc7ang/bvtLzRNNaG0+UyIJAtQIRvRwXNsRE1XcgtOAN6zfC25bzCbY7k1Pj Z2XVhg5XJL3I2GvbWRrxjiwsZ/iQUF8eE2VwRcum+IyQESQuYuJ1sjU/HA0YgdTLd5df aAS2vtU4Xwq7XpUsr/gOh9YlicnGtqh8NIaPaTmfJtGr6E+6GAayyvhkHEu8FSuECh1B 5J46DmRrK4enigAHF4Q9PMLy1XwgaxNiTXiuo5yXZx9OaDrq9Iytt0MDBzM+s5NgnmtF r7DZuU/cs5vpYaR06uygnYL/Svz2glzb435gr9h2ij6zCUsY7evF8uTEfcYVos49eCPE /0kw== 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=sYt00mr0IfTkoC787gh8tz9MgQqeyio7dEfp1uE5x/w=; b=qZysw1/Vs26e+f08usOn/GjYhmKnhJBaVkyXo7GyTmTZ+PUJZlGTHfa1oy7ePg+M+I 2mAUOYU404sG7vsxHTUpukGqm8bo90brKFrYzsioTQOUhj2+dPhONmKjYeYBzLnVErRX uo8JuXiFC+vWZgSGrsdwpvYSbmB8FncDd3YSeHIBHfpHIChO8nUu+DgFAaVJ2cu1aQvF fEn491wBWUKh79ryc3ROTZ0Td/ovOv+5304P8Y7sq4CoQN3+GH/1McL6deX/UfynuWF+ YuG5TMLUXvNWZJrpmePYhN2yZaRA3mljRKzLxd1CdH3cK5qsHb8vYBgkHsV/lX86AXV3 Q48A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=mxBLdJzX; 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 e16si12741911ilm.91.2021.07.04.13.29.08; Sun, 04 Jul 2021 13:29:21 -0700 (PDT) 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=mxBLdJzX; 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 S229881AbhGDUbP (ORCPT + 99 others); Sun, 4 Jul 2021 16:31:15 -0400 Received: from mail.kernel.org ([198.145.29.99]:36558 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229880AbhGDUbO (ORCPT ); Sun, 4 Jul 2021 16:31:14 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id F2AD9613F3; Sun, 4 Jul 2021 20:28:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1625430518; bh=GSKkzFV1KnCldT7AihGFOinVXAf3BT/60pJezRkXMr0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mxBLdJzX5x7nnGagn1EFXnW4GXK+ChMcVyMozxZk16DrWE/3XDdXASwfqqes7qSoe NUaf8FP4A1o6iUZVM91Qlx8CKlTOB+2nMdc8mkcXiP8eaEJnlZZ+T4NvcnutDD/mHp 5rlhd3NeTkcVeM39DRcNjFrK9EjVXIXNd4ofi4dW0xcpJ1BvwPxdXMAs8oOuttCu4d s4YT2BnFXXI+HSFifmn97eQmmc1vp99DnBXeSsH/2NgR7gqEL6j/BylUfBzIB7SCcu X9OKntbaTg/BU4tutkuAyw3HzK/yii+GmMcI0i9Ogx7ud0EuiZUsBBe4O+C91buofU LEHcr15ywwVyQ== From: ojeda@kernel.org 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 , Geoffrey Thomas , Finn Behrens , Adam Bratschi-Kaye , Wedson Almeida Filho Subject: [PATCH 01/17] kallsyms: support big kernel symbols (2-byte lengths) Date: Sun, 4 Jul 2021 22:27:40 +0200 Message-Id: <20210704202756.29107-2-ojeda@kernel.org> In-Reply-To: <20210704202756.29107-1-ojeda@kernel.org> References: <20210704202756.29107-1-ojeda@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Miguel Ojeda Rust symbols can become quite long due to namespacing introduced by modules, types, traits, generics, etc. Increasing to 255 is not enough in some cases, and therefore we need to introduce 2-byte lengths to the symbol table. We call these "big" symbols. In order to avoid increasing all lengths to 2 bytes (since most of them only require 1 byte, including many Rust ones), we use length zero to mark "big" symbols in the table. Co-developed-by: Alex Gaynor Signed-off-by: Alex Gaynor Co-developed-by: Geoffrey Thomas Signed-off-by: Geoffrey Thomas Co-developed-by: Finn Behrens Signed-off-by: Finn Behrens Co-developed-by: Adam Bratschi-Kaye Signed-off-by: Adam Bratschi-Kaye Co-developed-by: Wedson Almeida Filho Signed-off-by: Wedson Almeida Filho Signed-off-by: Miguel Ojeda --- kernel/kallsyms.c | 7 +++++++ scripts/kallsyms.c | 31 ++++++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c index c851ca0ed35..9d0c23e1993 100644 --- a/kernel/kallsyms.c +++ b/kernel/kallsyms.c @@ -73,6 +73,13 @@ static unsigned int kallsyms_expand_symbol(unsigned int off, */ off += len + 1; + /* If zero, it is a "big" symbol, so a two byte length follows. */ + if (len == 0) { + len = (data[0] << 8) | data[1]; + data += 2; + off += len + 2; + } + /* * For every byte on the compressed symbol data, copy the table * entry for that byte. diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c index 54ad86d1378..bcdabee13aa 100644 --- a/scripts/kallsyms.c +++ b/scripts/kallsyms.c @@ -470,12 +470,37 @@ static void write_src(void) if ((i & 0xFF) == 0) markers[i >> 8] = off; - printf("\t.byte 0x%02x", table[i]->len); + /* + * There cannot be any symbol of length zero -- we use that + * to mark a "big" symbol (and it doesn't make sense anyway). + */ + if (table[i]->len == 0) { + fprintf(stderr, "kallsyms failure: " + "unexpected zero symbol length\n"); + exit(EXIT_FAILURE); + } + + /* Only lengths that fit in up to two bytes are supported. */ + if (table[i]->len > 0xFFFF) { + fprintf(stderr, "kallsyms failure: " + "unexpected huge symbol length\n"); + exit(EXIT_FAILURE); + } + + if (table[i]->len <= 0xFF) { + /* Most symbols use a single byte for the length. */ + printf("\t.byte 0x%02x", table[i]->len); + off += table[i]->len + 1; + } else { + /* "Big" symbols use a zero and then two bytes. */ + printf("\t.byte 0x00, 0x%02x, 0x%02x", + (table[i]->len >> 8) & 0xFF, + table[i]->len & 0xFF); + off += table[i]->len + 3; + } for (k = 0; k < table[i]->len; k++) printf(", 0x%02x", table[i]->sym[k]); printf("\n"); - - off += table[i]->len + 1; } printf("\n"); -- 2.32.0