• Yuriy Kolerov's avatar
    ARC: change some branchs to jumps to resolve linkage errors · 6de6066c
    Yuriy Kolerov authored
    When kernel's binary becomes large enough (32M and more) errors
    may occur during the final linkage stage. It happens because
    the build system uses short relocations for ARC  by default.
    This problem may be easily resolved by passing -mlong-calls
    option to GCC to use long absolute jumps (j) instead of short
    relative branchs (b).
    
    But there are fragments of pure assembler code exist which use
    branchs in inappropriate places and cause a linkage error because
    of relocations overflow.
    
    First of these fragments is .fixup insertion in futex.h and
    unaligned.c. It inserts a code in the separate section (.fixup)
    with branch instruction. It leads to the linkage error when
    kernel becomes large.
    
    Second of these fragments is calling scheduler's functions
    (common kernel code) from entry.S of ARC's code. When kernel's
    binary becomes large it may lead to the linkage error because
    scheduler may occur far enough from ARC's code in the final
    binary.
    Signed-off-by: default avatarYuriy Kolerov <yuriy.kolerov@synopsys.com>
    Signed-off-by: default avatarVineet Gupta <vgupta@synopsys.com>
    6de6066c
entry.S 10.6 KB