• Dave Martin's avatar
    ARM: 6963/1: Thumb-2: Relax relocation requirements for non-function symbols · 9a00318e
    Dave Martin authored
    The "Thumb bit" of a symbol is only really meaningful for function
    symbols (STT_FUNC).
    
    However, sometimes a branch is relocated against a non-function
    symbol; for example, PC-relative branches to anonymous assembler
    local symbols are typically fixed up against the start-of-section
    symbol, which is not a function symbol.  Some inline assembler
    generates references of this type, such as fixup code generated by
    macros in <asm/uaccess.h>.
    
    The existing relocation code for R_ARM_THM_CALL/R_ARM_THM_JUMP24
    interprets this case as an error, because the target symbol appears
    to be an ARM symbol; but this is really not the case, since the
    target symbol is just a base in these cases.  The addend defines
    the precise offset to the target location, but since the addend is
    encoded in a non-interworking Thumb branch instruction, there is no
    explicit Thumb bit in the addend.  Because these instructions never
    interwork, the implied Thumb bit in the addend is 1, and the
    destination is Thumb by definition.
    
    This patch removes the extraneous Thumb bit check for non-function
    symbols, enabling modules containing the affected relocation types
    to be loaded.  No modification to the actual relocation code is
    required, since this code does not take bit[0] of the
    location->destination offset into account in any case.
    
    Function symbols are always checked for interworking conflicts, as
    before.
    Signed-off-by: default avatarDave Martin <dave.martin@linaro.org>
    Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    9a00318e
module.c 9.83 KB