lkml.org 
[lkml]   [2022]   [May]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v7 03/25] kallsyms: increase maximum kernel symbol length to 512
    Date
    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>
    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>
    ---
    This is a prerequisite patch, independently submitted at:

    https://lore.kernel.org/lkml/20220506203443.24721-4-ojeda@kernel.org/

    include/linux/kallsyms.h | 2 +-
    kernel/livepatch/core.c | 4 ++--
    scripts/kallsyms.c | 4 ++--
    tools/include/linux/kallsyms.h | 2 +-
    tools/lib/perf/include/perf/event.h | 2 +-
    tools/lib/symbol/kallsyms.h | 2 +-
    6 files changed, 8 insertions(+), 8 deletions(-)

    diff --git a/include/linux/kallsyms.h b/include/linux/kallsyms.h
    index ce1bd2fbf23e..e5ad6e31697d 100644
    --- a/include/linux/kallsyms.h
    +++ b/include/linux/kallsyms.h
    @@ -15,7 +15,7 @@

    #include <asm/sections.h>

    -#define KSYM_NAME_LEN 128
    +#define KSYM_NAME_LEN 512
    #define KSYM_SYMBOL_LEN (sizeof("%s+%#lx/%#lx [%s %s]") + \
    (KSYM_NAME_LEN - 1) + \
    2*(BITS_PER_LONG*3/10) + (MODULE_NAME_LEN - 1) + \
    diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c
    index bc475e62279d..ec06ce59d728 100644
    --- a/kernel/livepatch/core.c
    +++ b/kernel/livepatch/core.c
    @@ -213,7 +213,7 @@ static int klp_resolve_symbols(Elf_Shdr *sechdrs, const char *strtab,
    * we use the smallest/strictest upper bound possible (56, based on
    * the current definition of MODULE_NAME_LEN) to prevent overflows.
    */
    - BUILD_BUG_ON(MODULE_NAME_LEN < 56 || KSYM_NAME_LEN != 128);
    + BUILD_BUG_ON(MODULE_NAME_LEN < 56 || KSYM_NAME_LEN != 512);

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

    /* Format: .klp.sym.sym_objname.sym_name,sympos */
    cnt = sscanf(strtab + sym->st_name,
    - ".klp.sym.%55[^.].%127[^,],%lu",
    + ".klp.sym.%55[^.].%511[^,],%lu",
    sym_objname, sym_name, &sympos);
    if (cnt != 3) {
    pr_err("symbol %s has an incorrectly formatted name\n",
    diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c
    index 7e99799aa7b9..275044b840dc 100644
    --- a/scripts/kallsyms.c
    +++ b/scripts/kallsyms.c
    @@ -30,10 +30,10 @@
    #define _stringify_1(x) #x
    #define _stringify(x) _stringify_1(x)

    -#define KSYM_NAME_LEN 128
    +#define KSYM_NAME_LEN 512

    /* A substantially bigger size than the current maximum. */
    -#define KSYM_NAME_LEN_BUFFER 512
    +#define KSYM_NAME_LEN_BUFFER 2048
    _Static_assert(
    KSYM_NAME_LEN_BUFFER == KSYM_NAME_LEN * 4,
    "Please keep KSYM_NAME_LEN_BUFFER in sync with KSYM_NAME_LEN"
    diff --git a/tools/include/linux/kallsyms.h b/tools/include/linux/kallsyms.h
    index efb6c3f5f2a9..5a37ccbec54f 100644
    --- a/tools/include/linux/kallsyms.h
    +++ b/tools/include/linux/kallsyms.h
    @@ -6,7 +6,7 @@
    #include <stdio.h>
    #include <unistd.h>

    -#define KSYM_NAME_LEN 128
    +#define KSYM_NAME_LEN 512

    struct module;

    diff --git a/tools/lib/perf/include/perf/event.h b/tools/lib/perf/include/perf/event.h
    index e7758707cadd..116a80c31675 100644
    --- a/tools/lib/perf/include/perf/event.h
    +++ b/tools/lib/perf/include/perf/event.h
    @@ -95,7 +95,7 @@ struct perf_record_throttle {
    };

    #ifndef KSYM_NAME_LEN
    -#define KSYM_NAME_LEN 256
    +#define KSYM_NAME_LEN 512
    #endif

    struct perf_record_ksymbol {
    diff --git a/tools/lib/symbol/kallsyms.h b/tools/lib/symbol/kallsyms.h
    index 72ab9870454b..542f9b059c3b 100644
    --- a/tools/lib/symbol/kallsyms.h
    +++ b/tools/lib/symbol/kallsyms.h
    @@ -7,7 +7,7 @@
    #include <linux/types.h>

    #ifndef KSYM_NAME_LEN
    -#define KSYM_NAME_LEN 256
    +#define KSYM_NAME_LEN 512
    #endif

    static inline u8 kallsyms2elf_binding(char type)
    --
    2.36.1
    \
     
     \ /
      Last update: 2022-05-23 04:04    [W:4.538 / U:0.192 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site