• A
    ARM: kernel: allocate PLT entries only for external symbols · 05123fef
    Ard Biesheuvel 提交于
    When CONFIG_ARM_MODULE_PLTS is enabled, jump and call instructions in
    modules no longer need to be within 16 MB (8 MB for Thumb2) of their
    targets. If they are further away, a PLT entry will be generated on the
    fly for each of them, which extends the range to the entire 32-bit
    address space.
    
    However, since these PLT entries will become the branch targets of the
    original jump and call instructions, the PLT itself needs to be in
    range, or we end up in the same situation we started in. Since the PLT
    is in a separate section, this essentially means that all jumps and calls
    inside the same module must be resolvable without PLT entries.
    
    The PLT allocation code executes before the module itself is loaded in
    its final location, and so it has to use a worst-case estimate for
    which jumps and calls will require an entry in the PLT at relocation
    time. As an optimization, this code deduplicates entries pointing to
    the same symbol, using a O(n^2) algorithm. However, it does not take
    the above into account, i.e., that PLT entries will only be needed for
    jump and call relocations against symbols that are not defined in the
    module.
    
    So disregard relocations against symbols that are defined in the module
    itself.
    
    As an additional minor optimization, ignore input sections that lack
    the SHF_EXECINSTR flag. Since jump and call relocations operate on
    executable instructions only, there is no need to look in sections that
    do not contain executable code.
    Tested-by: NJongsung Kim <neidhard.kim@lge.com>
    Signed-off-by: NArd Biesheuvel <ard.biesheuvel@linaro.org>
    05123fef
module-plts.c 4.6 KB