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

Matthew Wilcox
2021-07-04T21:34:17Z

On Sun, Jul 04, 2021 at 11:17:50PM +0200, Miguel Ojeda wrote:
> On Sun, Jul 4, 2021 at 11:05 PM Matthew Wilcox <willy@infradead.org> wrote:
> >
> > 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");