Skip to content
  • Ard Biesheuvel's avatar
    modversions: treat symbol CRCs as 32 bit quantities · 71810db2
    Ard Biesheuvel authored
    The modversion symbol CRCs are emitted as ELF symbols, which allows us
    to easily populate the kcrctab sections by relying on the linker to
    associate each kcrctab slot with the correct value.
    
    This has a couple of downsides:
    
     - Given that the CRCs are treated as memory addresses, we waste 4 bytes
       for each CRC on 64 bit architectures,
    
     - On architectures that support runtime relocation, a R_<arch>_RELATIVE
       relocation entry is emitted for each CRC value, which identifies it
       as a quantity that requires fixing up based on the actual runtime
       load offset of the kernel. This results in corrupted CRCs unless we
       explicitly undo the fixup (and this is currently being handled in the
       core module code)
    
     - Such runtime relocation entries take up 24 bytes of __init space
       each, resulting in a x8 overhead in [uncompressed] kernel size for
       CRCs.
    
    Switching to explicit 32 bit values on 64 bit architectures fixes most
    of these issues, given that 32 bit values are not treated as quantities
    that require fixing up based on the actual runtime load offset.  Note
    that on some ELF64 architectures [such as PPC64], these 32-bit values
    are still emitted as [absolute] runtime relocatable quantities, even if
    the value resolves to a build time constant.  Since relative relocations
    are always resolved at build time, this patch enables MODULE_REL_CRCS on
    powerpc when CONFIG_RELOCATABLE=y, which turns the absolute CRC
    references into relative references into .rodata where the actual CRC
    value is stored.
    
    So redefine all CRC fields and variables as u32, and redefine the
    __CRC_SYMBOL() macro for 64 bit builds to emit the CRC reference using
    inline assembler (which is necessary since 64-bit C code cannot use
    32-bit types to hold memory addresses, even if they are ultimately
    resolved using values that do not exceed 0xffffffff).  To avoid
    potential problems with legacy 32-bit architectures using legacy
    toolchains, the equivalent C definition of the kcrctab entry is retained
    for 32-bit architectures.
    
    Note that this mostly reverts commit d4703aef
    
     ("module: handle ppc64
    relocating kcrctabs when CONFIG_RELOCATABLE=y")
    
    Acked-by: default avatarRusty Russell <rusty@rustcorp.com.au>
    Signed-off-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    71810db2