Skip to content
  • Rusty Russell's avatar
    kallsyms: fix percpu vars on x86-64 with relocation. · c6bda7c9
    Rusty Russell authored
    
    
    x86-64 has a problem: per-cpu variables are actually represented by
    their absolute offsets within the per-cpu area, but the symbols are
    not emitted as absolute.  Thus kallsyms naively creates them as offsets
    from _text, meaning their values change if the kernel is relocated
    (especially noticeable with CONFIG_RANDOMIZE_BASE):
    
     $ egrep ' (gdt_|_(stext|_per_cpu_))' /root/kallsyms.nokaslr
     0000000000000000 D __per_cpu_start
     0000000000004000 D gdt_page
     0000000000014280 D __per_cpu_end
     ffffffff810001c8 T _stext
     ffffffff81ee53c0 D __per_cpu_offset
     $ egrep ' (gdt_|_(stext|_per_cpu_))' /root/kallsyms.kaslr1
     000000001f200000 D __per_cpu_start
     000000001f204000 D gdt_page
     000000001f214280 D __per_cpu_end
     ffffffffa02001c8 T _stext
     ffffffffa10e53c0 D __per_cpu_offset
    
    Making them absolute symbols is the Right Thing, but requires fixes to
    the relocs tool.  So for the moment, we add a --absolute-percpu option
    which makes them absolute from a kallsyms perspective:
    
     $ egrep ' (gdt_|_(stext|_per_cpu_))' /proc/kallsyms # no KASLR
     0000000000000000 A __per_cpu_start
     000000000000a000 A gdt_page
     0000000000013040 A __per_cpu_end
     ffffffff802001c8 T _stext
     ffffffff8099b180 D __per_cpu_offset
     ffffffff809a3000 D __per_cpu_load
     $ egrep ' (gdt_|_(stext|_per_cpu_))' /proc/kallsyms # With KASLR
     0000000000000000 A __per_cpu_start
     000000000000a000 A gdt_page
     0000000000013040 A __per_cpu_end
     ffffffff89c001c8 T _stext
     ffffffff8a39d180 D __per_cpu_offset
     ffffffff8a3a5000 D __per_cpu_load
    
    Based-on-the-original-screenplay-by: default avatarAndy Honig <ahonig@google.com>
    Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
    Acked-by: default avatarKees Cook <keescook@chromium.org>
    c6bda7c9