Skip to content

Commit b8a94bf

Browse files
committed
kallsyms: increase maximum kernel symbol length to 512
Rust symbols can become quite long due to namespacing introduced by modules, types, traits, generics, etc. For instance, the following code: pub mod my_module { pub struct MyType; pub struct MyGenericType<T>(T); pub trait MyTrait { fn my_method() -> u32; } impl MyTrait for MyGenericType<MyType> { fn my_method() -> u32 { 42 } } } generates a symbol of length 96 when using the upcoming v0 mangling scheme: _RNvXNtCshGpAVYOtgW1_7example9my_moduleINtB2_13MyGenericTypeNtB2_6MyTypeENtB2_7MyTrait9my_method At the moment, Rust symbols may reach up to 300 in length. Setting 512 as the maximum seems like a reasonable choice to keep some headroom. Reviewed-by: Kees Cook <[email protected]> Reviewed-by: Petr Mladek <[email protected]> Reviewed-by: Greg Kroah-Hartman <[email protected]> Co-developed-by: Alex Gaynor <[email protected]> Signed-off-by: Alex Gaynor <[email protected]> Co-developed-by: Wedson Almeida Filho <[email protected]> Signed-off-by: Wedson Almeida Filho <[email protected]> Co-developed-by: Gary Guo <[email protected]> Signed-off-by: Gary Guo <[email protected]> Co-developed-by: Boqun Feng <[email protected]> Signed-off-by: Boqun Feng <[email protected]> Signed-off-by: Miguel Ojeda <[email protected]>
1 parent 73bbb94 commit b8a94bf

File tree

6 files changed

+8
-8
lines changed

6 files changed

+8
-8
lines changed

include/linux/kallsyms.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
#include <asm/sections.h>
1717

18-
#define KSYM_NAME_LEN 128
18+
#define KSYM_NAME_LEN 512
1919
#define KSYM_SYMBOL_LEN (sizeof("%s+%#lx/%#lx [%s %s]") + \
2020
(KSYM_NAME_LEN - 1) + \
2121
2*(BITS_PER_LONG*3/10) + (MODULE_NAME_LEN - 1) + \

kernel/livepatch/core.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ static int klp_resolve_symbols(Elf_Shdr *sechdrs, const char *strtab,
213213
* we use the smallest/strictest upper bound possible (56, based on
214214
* the current definition of MODULE_NAME_LEN) to prevent overflows.
215215
*/
216-
BUILD_BUG_ON(MODULE_NAME_LEN < 56 || KSYM_NAME_LEN != 128);
216+
BUILD_BUG_ON(MODULE_NAME_LEN < 56 || KSYM_NAME_LEN != 512);
217217

218218
relas = (Elf_Rela *) relasec->sh_addr;
219219
/* For each rela in this klp relocation section */
@@ -227,7 +227,7 @@ static int klp_resolve_symbols(Elf_Shdr *sechdrs, const char *strtab,
227227

228228
/* Format: .klp.sym.sym_objname.sym_name,sympos */
229229
cnt = sscanf(strtab + sym->st_name,
230-
".klp.sym.%55[^.].%127[^,],%lu",
230+
".klp.sym.%55[^.].%511[^,],%lu",
231231
sym_objname, sym_name, &sympos);
232232
if (cnt != 3) {
233233
pr_err("symbol %s has an incorrectly formatted name\n",

scripts/kallsyms.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
#define _stringify_1(x) #x
3131
#define _stringify(x) _stringify_1(x)
3232

33-
#define KSYM_NAME_LEN 128
33+
#define KSYM_NAME_LEN 512
3434

3535
/*
3636
* A substantially bigger size than the current maximum.
@@ -39,7 +39,7 @@
3939
* for the fscanf() format string. Therefore, a _Static_assert() is
4040
* used instead to maintain the relationship with KSYM_NAME_LEN.
4141
*/
42-
#define KSYM_NAME_LEN_BUFFER 512
42+
#define KSYM_NAME_LEN_BUFFER 2048
4343
_Static_assert(
4444
KSYM_NAME_LEN_BUFFER == KSYM_NAME_LEN * 4,
4545
"Please keep KSYM_NAME_LEN_BUFFER in sync with KSYM_NAME_LEN"

tools/include/linux/kallsyms.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include <stdio.h>
77
#include <unistd.h>
88

9-
#define KSYM_NAME_LEN 128
9+
#define KSYM_NAME_LEN 512
1010

1111
struct module;
1212

tools/lib/perf/include/perf/event.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ struct perf_record_throttle {
9797
};
9898

9999
#ifndef KSYM_NAME_LEN
100-
#define KSYM_NAME_LEN 256
100+
#define KSYM_NAME_LEN 512
101101
#endif
102102

103103
struct perf_record_ksymbol {

tools/lib/symbol/kallsyms.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#include <linux/types.h>
88

99
#ifndef KSYM_NAME_LEN
10-
#define KSYM_NAME_LEN 256
10+
#define KSYM_NAME_LEN 512
1111
#endif
1212

1313
static inline u8 kallsyms2elf_binding(char type)

0 commit comments

Comments
 (0)