Thread (64 messages) 64 messages, 16 authors, 2021-07-23

Re: [PATCH 01/17] kallsyms: support big kernel symbols (2-byte lengths)

From: Matthew Wilcox <willy@infradead.org>
Date: 2021-07-04 21:34:16
Also in: linux-kbuild, lkml, rust-for-linux
Subsystem: the rest · Maintainer: Linus Torvalds

On Sun, Jul 04, 2021 at 11:17:50PM +0200, Miguel Ojeda wrote:
On Sun, Jul 4, 2021 at 11:05 PM Matthew Wilcox [off-list ref] wrote:
quoted
What happened to my suggestion from last time of encoding symbols < 128
as 0-127 and symbols larger than that as (data[0] - 128) * 256 +
data[1]) ?
Nothing, sorry, we focused on other parts (e.g. the allocation panics)
during this iteration. I can take a look for v2.
Here's what I have.  Build testing now.

diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c
index c851ca0ed357..0d45a6e5fdc3 100644
--- a/kernel/kallsyms.c
+++ b/kernel/kallsyms.c
@@ -67,6 +67,14 @@ static unsigned int kallsyms_expand_symbol(unsigned int off,
 	len = *data;
 	data++;
 
+	/* lengths larger than 128 are encoded as two bytes */
+	if (len >= 128) {
+		len -= 128;
+		len *= 256;
+		len += *data;
+		data++;
+	}
+
 	/*
 	 * Update the offset to return the offset for the next symbol on
 	 * the compressed stream.
diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c
index 54ad86d13784..701566e01a1d 100644
--- a/scripts/kallsyms.c
+++ b/scripts/kallsyms.c
@@ -467,10 +467,16 @@ static void write_src(void)
 	output_label("kallsyms_names");
 	off = 0;
 	for (i = 0; i < table_cnt; i++) {
+		int len = table[i]->len;
 		if ((i & 0xFF) == 0)
 			markers[i >> 8] = off;
 
-		printf("\t.byte 0x%02x", table[i]->len);
+		if (len >= 128) {
+			printf("\t.byte 0x%02x\n", len / 256 + 128);
+			len %= 256;
+			off++;
+		}
+		printf("\t.byte 0x%02x", len);
 		for (k = 0; k < table[i]->len; k++)
 			printf(", 0x%02x", table[i]->sym[k]);
 		printf("\n");
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help