• A
    arm64: relocatable: suppress R_AARCH64_ABS64 relocations in vmlinux · 08cc55b2
    Ard Biesheuvel 提交于
    The linker routines that we rely on to produce a relocatable PIE binary
    treat it as a shared ELF object in some ways, i.e., it emits symbol based
    R_AARCH64_ABS64 relocations into the final binary since doing so would be
    appropriate when linking a shared library that is subject to symbol
    preemption. (This means that an executable can override certain symbols
    that are exported by a shared library it is linked with, and that the
    shared library *must* update all its internal references as well, and point
    them to the version provided by the executable.)
    
    Symbol preemption does not occur for OS hosted PIE executables, let alone
    for vmlinux, and so we would prefer to get rid of these symbol based
    relocations. This would allow us to simplify the relocation routines, and
    to strip the .dynsym, .dynstr and .hash sections from the binary. (Note
    that these are tiny, and are placed in the .init segment, but they clutter
    up the vmlinux binary.)
    
    Note that these R_AARCH64_ABS64 relocations are only emitted for absolute
    references to symbols defined in the linker script, all other relocatable
    quantities are covered by anonymous R_AARCH64_RELATIVE relocations that
    simply list the offsets to all 64-bit values in the binary that need to be
    fixed up based on the offset between the link time and run time addresses.
    
    Fortunately, GNU ld has a -Bsymbolic option, which is intended for shared
    libraries to allow them to ignore symbol preemption, and unconditionally
    bind all internal symbol references to its own definitions. So set it for
    our PIE binary as well, and get rid of the asoociated sections and the
    relocation code that processes them.
    Signed-off-by: NArd Biesheuvel <ard.biesheuvel@linaro.org>
    [will: fixed conflict with __dynsym_offset linker script entry]
    Signed-off-by: NWill Deacon <will.deacon@arm.com>
    08cc55b2
head.S 21.8 KB