Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <keescook@chromium.org>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.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>
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>

+8 -8
+1 -1
include/linux/kallsyms.h
··· 15 15 16 16 #include <asm/sections.h> 17 17 18 - #define KSYM_NAME_LEN 128 18 + #define KSYM_NAME_LEN 512 19 19 #define KSYM_SYMBOL_LEN (sizeof("%s+%#lx/%#lx [%s %s]") + \ 20 20 (KSYM_NAME_LEN - 1) + \ 21 21 2*(BITS_PER_LONG*3/10) + (MODULE_NAME_LEN - 1) + \
+2 -2
kernel/livepatch/core.c
··· 213 213 * we use the smallest/strictest upper bound possible (56, based on 214 214 * the current definition of MODULE_NAME_LEN) to prevent overflows. 215 215 */ 216 - BUILD_BUG_ON(MODULE_NAME_LEN < 56 || KSYM_NAME_LEN != 128); 216 + BUILD_BUG_ON(MODULE_NAME_LEN < 56 || KSYM_NAME_LEN != 512); 217 217 218 218 relas = (Elf_Rela *) relasec->sh_addr; 219 219 /* For each rela in this klp relocation section */ ··· 227 227 228 228 /* Format: .klp.sym.sym_objname.sym_name,sympos */ 229 229 cnt = sscanf(strtab + sym->st_name, 230 - ".klp.sym.%55[^.].%127[^,],%lu", 230 + ".klp.sym.%55[^.].%511[^,],%lu", 231 231 sym_objname, sym_name, &sympos); 232 232 if (cnt != 3) { 233 233 pr_err("symbol %s has an incorrectly formatted name\n",
+2 -2
scripts/kallsyms.c
··· 30 30 #define _stringify_1(x) #x 31 31 #define _stringify(x) _stringify_1(x) 32 32 33 - #define KSYM_NAME_LEN 128 33 + #define KSYM_NAME_LEN 512 34 34 35 35 /* 36 36 * A substantially bigger size than the current maximum. ··· 39 39 * for the fscanf() format string. Therefore, a _Static_assert() is 40 40 * used instead to maintain the relationship with KSYM_NAME_LEN. 41 41 */ 42 - #define KSYM_NAME_LEN_BUFFER 512 42 + #define KSYM_NAME_LEN_BUFFER 2048 43 43 _Static_assert( 44 44 KSYM_NAME_LEN_BUFFER == KSYM_NAME_LEN * 4, 45 45 "Please keep KSYM_NAME_LEN_BUFFER in sync with KSYM_NAME_LEN"
+1 -1
tools/include/linux/kallsyms.h
··· 6 6 #include <stdio.h> 7 7 #include <unistd.h> 8 8 9 - #define KSYM_NAME_LEN 128 9 + #define KSYM_NAME_LEN 512 10 10 11 11 struct module; 12 12
+1 -1
tools/lib/perf/include/perf/event.h
··· 97 97 }; 98 98 99 99 #ifndef KSYM_NAME_LEN 100 - #define KSYM_NAME_LEN 256 100 + #define KSYM_NAME_LEN 512 101 101 #endif 102 102 103 103 struct perf_record_ksymbol {
+1 -1
tools/lib/symbol/kallsyms.h
··· 7 7 #include <linux/types.h> 8 8 9 9 #ifndef KSYM_NAME_LEN 10 - #define KSYM_NAME_LEN 256 10 + #define KSYM_NAME_LEN 512 11 11 #endif 12 12 13 13 static inline u8 kallsyms2elf_binding(char type)