• Ard Biesheuvel's avatar
    kallsyms: don't overload absolute symbol type for percpu symbols · 8c996940
    Ard Biesheuvel authored
    Commit c6bda7c9 ("kallsyms: fix percpu vars on x86-64 with
    relocation") overloaded the 'A' (absolute) symbol type to signify that a
    symbol is not subject to dynamic relocation.  However, the original A
    type does not imply that at all, and depending on the version of the
    toolchain, many A type symbols are emitted that are in fact relative to
    the kernel text, i.e., if the kernel is relocated at runtime, these
    symbols should be updated as well.
    
    For instance, on sparc32, the following symbols are emitted as absolute
    (kindly provided by Guenter Roeck):
    
      f035a420 A _etext
      f03d9000 A _sdata
      f03de8c4 A jiffies
      f03f8860 A _edata
      f03fc000 A __init_begin
      f041bdc8 A __init_text_end
      f0423000 A __bss_start
      f0423000 A __init_end
      f044457d A __bss_stop
      f044457d A _end
    
    On x86_64, similar behavior can be observed:
    
      ffffffff81a00000 A __end_rodata_hpage_align
      ffffffff81b19000 A __vvar_page
      ffffffff81d3d000 A _end
    
    Even if only a couple of them pass the symbol range check that results
    in them to be taken into account for the final kallsyms symbol table, it
    is obvious that 'A' does not mean the symbol does not need to be updated
    at relocation time, and overloading its meaning to signify that is
    perhaps not a good idea.
    
    So instead, add a new percpu_absolute member to struct sym_entry, and
    when --absolute-percpu is in effect, use it to record symbols whose
    addresses should be emitted as final values rather than values that
    still require relocation at runtime.  That way, we can drop the check
    against the 'A' type.
    Signed-off-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
    Tested-by: default avatarGuenter Roeck <linux@roeck-us.net>
    Reviewed-by: default avatarKees Cook <keescook@chromium.org>
    Tested-by: default avatarKees Cook <keescook@chromium.org>
    Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Cc: Michal Marek <mmarek@suse.cz>
    Acked-by: default avatarRusty Russell <rusty@rustcorp.com.au>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    8c996940
kallsyms.c 16.9 KB