linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Miguel Ojeda <ojeda@kernel.org>
To: Linus Torvalds <torvalds@linux-foundation.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-fsdevel@vger.kernel.org, patches@lists.linux.dev,
	Jarkko Sakkinen <jarkko@kernel.org>,
	Miguel Ojeda <ojeda@kernel.org>,
	Kees Cook <keescook@chromium.org>,
	Alex Gaynor <alex.gaynor@gmail.com>,
	Wedson Almeida Filho <wedsonaf@google.com>,
	Gary Guo <gary@garyguo.net>, Boqun Feng <boqun.feng@gmail.com>,
	Matthew Wilcox <willy@infradead.org>
Subject: [PATCH v10 04/27] kallsyms: support "big" kernel symbols
Date: Tue, 27 Sep 2022 15:14:35 +0200	[thread overview]
Message-ID: <20220927131518.30000-5-ojeda@kernel.org> (raw)
In-Reply-To: <20220927131518.30000-1-ojeda@kernel.org>

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, therefore
introduce longer lengths to the symbol table.

In order to avoid increasing all lengths to 2 bytes (since most
of them are small, including many Rust ones), use ULEB128 to
keep smaller symbols in 1 byte, with the rest in 2 bytes.

Reviewed-by: Kees Cook <keescook@chromium.org>
Co-developed-by: Alex Gaynor <alex.gaynor@gmail.com>
Signed-off-by: Alex Gaynor <alex.gaynor@gmail.com>
Co-developed-by: Wedson Almeida Filho <wedsonaf@google.com>
Signed-off-by: Wedson Almeida Filho <wedsonaf@google.com>
Co-developed-by: Gary Guo <gary@garyguo.net>
Signed-off-by: Gary Guo <gary@garyguo.net>
Co-developed-by: Boqun Feng <boqun.feng@gmail.com>
Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
Co-developed-by: Matthew Wilcox <willy@infradead.org>
Signed-off-by: Matthew Wilcox <willy@infradead.org>
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
---
 kernel/kallsyms.c  | 26 ++++++++++++++++++++++----
 scripts/kallsyms.c | 29 ++++++++++++++++++++++++++---
 2 files changed, 48 insertions(+), 7 deletions(-)

diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c
index 3e7e2c2ad2f7..fc5e26348d25 100644
--- a/kernel/kallsyms.c
+++ b/kernel/kallsyms.c
@@ -50,12 +50,20 @@ static unsigned int kallsyms_expand_symbol(unsigned int off,
 	data = &kallsyms_names[off];
 	len = *data;
 	data++;
+	off++;
+
+	/* If MSB is 1, it is a "big" symbol, so needs an additional byte. */
+	if ((len & 0x80) != 0) {
+		len = (len & 0x7F) | (*data << 7);
+		data++;
+		off++;
+	}
 
 	/*
 	 * Update the offset to return the offset for the next symbol on
 	 * the compressed stream.
 	 */
-	off += len + 1;
+	off += len;
 
 	/*
 	 * For every byte on the compressed symbol data, copy the table
@@ -108,7 +116,7 @@ static char kallsyms_get_symbol_type(unsigned int off)
 static unsigned int get_symbol_offset(unsigned long pos)
 {
 	const u8 *name;
-	int i;
+	int i, len;
 
 	/*
 	 * Use the closest marker we have. We have markers every 256 positions,
@@ -122,8 +130,18 @@ static unsigned int get_symbol_offset(unsigned long pos)
 	 * so we just need to add the len to the current pointer for every
 	 * symbol we wish to skip.
 	 */
-	for (i = 0; i < (pos & 0xFF); i++)
-		name = name + (*name) + 1;
+	for (i = 0; i < (pos & 0xFF); i++) {
+		len = *name;
+
+		/*
+		 * If MSB is 1, it is a "big" symbol, so we need to look into
+		 * the next byte (and skip it, too).
+		 */
+		if ((len & 0x80) != 0)
+			len = ((len & 0x7F) | (name[1] << 7)) + 1;
+
+		name = name + len + 1;
+	}
 
 	return name - kallsyms_names;
 }
diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c
index 411ff5058b51..6502c4001f01 100644
--- a/scripts/kallsyms.c
+++ b/scripts/kallsyms.c
@@ -487,12 +487,35 @@ 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. */
+		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-byte ULEB128 are supported. */
+		if (table[i]->len > 0x3FFF) {
+			fprintf(stderr, "kallsyms failure: "
+				"unexpected huge symbol length\n");
+			exit(EXIT_FAILURE);
+		}
+
+		/* Encode length with ULEB128. */
+		if (table[i]->len <= 0x7F) {
+			/* 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 two bytes. */
+			printf("\t.byte 0x%02x, 0x%02x",
+				(table[i]->len & 0x7F) | 0x80,
+				(table[i]->len >> 7) & 0x7F);
+			off += table[i]->len + 2;
+		}
 		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.37.3


  parent reply	other threads:[~2022-09-27 13:16 UTC|newest]

Thread overview: 109+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-27 13:14 [PATCH v10 00/27] Rust support Miguel Ojeda
2022-09-27 13:14 ` [PATCH v10 01/27] kallsyms: use `ARRAY_SIZE` instead of hardcoded size Miguel Ojeda
2022-09-27 14:05   ` Geert Stappers
2022-09-27 14:51   ` Greg Kroah-Hartman
2022-09-28 14:58   ` Wei Liu
2022-09-27 13:14 ` [PATCH v10 02/27] kallsyms: avoid hardcoding buffer size Miguel Ojeda
2022-09-27 14:52   ` Greg Kroah-Hartman
2022-09-28 14:59   ` Wei Liu
2022-09-27 13:14 ` [PATCH v10 03/27] kallsyms: add static relationship between `KSYM_NAME_LEN{,_BUFFER}` Miguel Ojeda
2022-09-27 14:54   ` Greg Kroah-Hartman
2022-09-27 13:14 ` Miguel Ojeda [this message]
2022-09-27 14:55   ` [PATCH v10 04/27] kallsyms: support "big" kernel symbols Greg Kroah-Hartman
2022-10-29 17:41   ` Guenter Roeck
2022-10-29 18:23     ` Guenter Roeck
2022-09-27 13:14 ` [PATCH v10 05/27] kallsyms: increase maximum kernel symbol length to 512 Miguel Ojeda
2022-09-27 14:56   ` Greg Kroah-Hartman
2022-09-27 13:14 ` [PATCH v10 06/27] rust: add C helpers Miguel Ojeda
2022-09-27 14:59   ` Greg Kroah-Hartman
2022-09-27 13:14 ` [PATCH v10 07/27] rust: import upstream `alloc` crate Miguel Ojeda
2022-09-27 13:14 ` [PATCH v10 08/27] rust: adapt `alloc` crate to the kernel Miguel Ojeda
2022-09-27 13:51   ` Konstantin Shelekhin
2022-09-27 14:06     ` Miguel Ojeda
2022-09-27 15:13       ` Konstantin Shelekhin
2022-09-27 16:01         ` Miguel Ojeda
2022-09-27 15:35   ` Greg Kroah-Hartman
2022-09-28 15:10   ` Wei Liu
2022-09-28 15:25     ` Miguel Ojeda
2022-09-28 15:27       ` Wei Liu
2022-09-27 13:14 ` [PATCH v10 09/27] rust: add `compiler_builtins` crate Miguel Ojeda
2022-09-28 13:25   ` Wei Liu
2022-09-27 13:14 ` [PATCH v10 10/27] rust: add `macros` crate Miguel Ojeda
2022-09-27 13:48   ` Konstantin Shelekhin
2022-09-27 13:59     ` Geert Stappers
2022-09-27 14:01     ` Miguel Ojeda
2022-09-28 15:29   ` Wei Liu
2022-09-28 16:36     ` Miguel Ojeda
2022-09-27 13:14 ` [PATCH v10 11/27] rust: add `bindings` crate Miguel Ojeda
2022-09-27 15:23   ` Greg Kroah-Hartman
2022-09-27 13:14 ` [PATCH v10 12/27] rust: add `kernel` crate Miguel Ojeda
2022-09-27 15:22   ` Greg Kroah-Hartman
2022-09-27 15:36     ` Alex Gaynor
2022-09-27 15:43     ` Miguel Ojeda
2022-09-27 13:14 ` [PATCH v10 13/27] rust: export generated symbols Miguel Ojeda
2022-09-27 15:32   ` Greg Kroah-Hartman
2022-09-27 13:14 ` [PATCH v10 14/27] vsprintf: add new `%pA` format specifier Miguel Ojeda
2022-09-27 15:00   ` Greg Kroah-Hartman
2022-09-28 10:09   ` Sergey Senozhatsky
2022-09-27 13:14 ` [PATCH v10 15/27] scripts: checkpatch: diagnose uses of `%pA` in the C side as errors Miguel Ojeda
2022-09-27 15:03   ` Greg Kroah-Hartman
2022-09-27 13:14 ` [PATCH v10 16/27] scripts: checkpatch: enable language-independent checks for Rust Miguel Ojeda
2022-09-27 15:02   ` Greg Kroah-Hartman
2022-09-27 13:14 ` [PATCH v10 17/27] scripts: decode_stacktrace: demangle Rust symbols Miguel Ojeda
2022-09-27 15:02   ` Greg Kroah-Hartman
2022-09-27 13:14 ` [PATCH v10 18/27] scripts: add `generate_rust_analyzer.py` Miguel Ojeda
2022-09-27 13:14 ` [PATCH v10 19/27] scripts: add `generate_rust_target.rs` Miguel Ojeda
2022-09-27 13:14 ` [PATCH v10 20/27] scripts: add `rust_is_available.sh` Miguel Ojeda
2022-09-28 14:49   ` Wei Liu
2022-09-27 13:14 ` [PATCH v10 21/27] scripts: add `is_rust_module.sh` Miguel Ojeda
2022-09-27 15:26   ` Greg Kroah-Hartman
2022-09-27 13:14 ` [PATCH v10 22/27] rust: add `.rustfmt.toml` Miguel Ojeda
2022-09-28 13:30   ` Wei Liu
2022-09-27 13:14 ` [PATCH v10 23/27] Kbuild: add Rust support Miguel Ojeda
2022-09-27 15:30   ` Greg Kroah-Hartman
2022-09-28 14:56   ` Wei Liu
2022-09-27 13:14 ` [PATCH v10 24/27] docs: add Rust documentation Miguel Ojeda
2022-09-27 13:14 ` [PATCH v10 25/27] x86: enable initial Rust support Miguel Ojeda
2022-09-27 15:31   ` Greg Kroah-Hartman
2022-09-28 14:32   ` Wei Liu
2022-09-28 16:39     ` Miguel Ojeda
2022-10-07 17:17   ` Peter Zijlstra
2022-10-10 23:15     ` Sami Tolvanen
2022-10-11  8:04       ` Peter Zijlstra
2022-10-14 17:23         ` Miguel Ojeda
2022-10-14 17:25           ` Boqun Feng
2022-10-14 18:05       ` Miguel Ojeda
2022-10-14 18:34         ` Sami Tolvanen
2022-10-14 20:39           ` Miguel Ojeda
2023-10-09 16:00             ` Matthew Maurer
2023-10-09 16:31               ` Miguel Ojeda
2023-10-09 17:37                 ` Greg Kroah-Hartman
2023-10-12 10:47           ` Peter Zijlstra
2023-10-12 17:50             ` Sami Tolvanen
2023-10-12 18:31               ` Kees Cook
2023-10-12 22:26                 ` Ramon de C Valle
     [not found]                 ` <CAOcBZOTed1a1yOimdUN9yuuysZ1h6VXa57+5fLAE99SZxCwBMQ@mail.gmail.com>
2023-10-13  7:50                   ` Peter Zijlstra
2023-10-13 12:17                     ` Ramon de C Valle
2023-10-13 18:54                       ` Linus Torvalds
2023-10-13 19:00                         ` H. Peter Anvin
2023-10-13 19:22                           ` Linus Torvalds
2023-10-14 20:25                           ` comex
2023-10-14 20:50                             ` H. Peter Anvin
2022-09-27 13:14 ` [PATCH v10 26/27] samples: add first Rust examples Miguel Ojeda
2022-09-27 15:25   ` Greg Kroah-Hartman
2022-09-28 14:23   ` Wei Liu
2022-09-27 13:14 ` [PATCH v10 27/27] MAINTAINERS: Rust Miguel Ojeda
2022-09-27 14:11   ` Geert Stappers
2022-09-27 15:19     ` Kees Cook
2022-09-27 15:34       ` Greg Kroah-Hartman
2022-09-27 15:53         ` Miguel Ojeda
2022-09-27 16:39           ` Greg Kroah-Hartman
2022-09-27 18:14             ` Kees Cook
2022-09-28  0:11           ` Kees Cook
2022-09-28 11:57             ` Wedson Almeida Filho
2022-09-28 12:22               ` Miguel Ojeda
2022-09-27 16:00       ` Wedson Almeida Filho
2022-09-27 16:38   ` Greg Kroah-Hartman
2022-09-28 15:06 ` [PATCH v10 00/27] Rust support Wei Liu
2022-09-28 15:34   ` Miguel Ojeda
2022-09-28 15:40     ` Wei Liu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220927131518.30000-5-ojeda@kernel.org \
    --to=ojeda@kernel.org \
    --cc=alex.gaynor@gmail.com \
    --cc=boqun.feng@gmail.com \
    --cc=gary@garyguo.net \
    --cc=gregkh@linuxfoundation.org \
    --cc=jarkko@kernel.org \
    --cc=keescook@chromium.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=patches@lists.linux.dev \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=wedsonaf@google.com \
    --cc=willy@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).