• Ard Biesheuvel's avatar
    x86/kallsyms: fix GOLD link failure with new relative kallsyms table format · 142b9e6c
    Ard Biesheuvel authored
    Commit 2213e9a6 ("kallsyms: add support for relative offsets in
    kallsyms address table") changed the default kallsyms symbol table
    format to use relative references rather than absolute addresses.
    
    This reduces the size of the kallsyms symbol table by 50% on 64-bit
    architectures, and further reduces the size of the relocation tables
    used by relocatable kernels.  Since the memory footprint of the static
    kernel image is always much smaller than 4 GB, these relative references
    are assumed to be representable in 32 bits, even when the native word
    size is 64 bits.
    
    On 64-bit architectures, this obviously only works if the distance
    between each relative reference and the chosen anchor point is
    representable in 32 bits, and so the table generation code in
    scripts/kallsyms.c scans the table for the lowest value that is covered
    by the kernel text, and selects it as the anchor point.
    
    However, when using the GOLD linker rather than the default BFD linker
    to build the x86_64 kernel, the symbol phys_offset_64, which is the
    result of arithmetic defined in the linker script, is emitted as a 'T'
    rather than an 'A' type symbol, resulting in scripts/kallsyms.c to
    mistake it for a suitable anchor point, even though it is far away from
    the actual kernel image in the virtual address space.  This results in
    out-of-range warnings from scripts/kallsyms.c and a broken build.
    
    So let's align with the BFD linker, and emit the phys_offset_[32|64]
    symbols as absolute symbols explicitly.  Note that the out of range
    issue does not exist on 32-bit x86, but this patch changes both symbols
    for symmetry.
    Reported-by: default avatarMarkus Trippelsdorf <markus@trippelsdorf.de>
    Signed-off-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    142b9e6c
vmlinux.lds.S 9.04 KB