• Fangrui Song's avatar
    arm64: lds: move .got section out of .text · 0fddb79b
    Fangrui Song authored
    Currently, the .got section is placed within the output section .text.
    However, when .got is non-empty, the SHF_WRITE flag is set for .text
    when linked by lld. GNU ld recognizes .text as a special section and
    ignores the SHF_WRITE flag. By renaming .text, we can also get the
    SHF_WRITE flag.
    
    The kernel has performed R_AARCH64_RELATIVE resolving very early, and can
    then assume that .got is read-only. Let's move .got to the vmlinux_rodata
    pseudo-segment.
    
    As Ard Biesheuvel notes:
    
    "This matters to consumers of the vmlinux ELF representation of the
    kernel image, such as syzkaller, which disregards writable PT_LOAD
    segments when resolving code symbols. The kernel itself does not care
    about this distinction, but given that the GOT contains data and not
    code, it does not require executable permissions, and therefore does
    not belong in .text to begin with."
    Reviewed-by: default avatarArd Biesheuvel <ardb@kernel.org>
    Signed-off-by: default avatarFangrui Song <maskray@google.com>
    Link: https://lore.kernel.org/r/20230502074105.1541926-1-maskray@google.comSigned-off-by: default avatarWill Deacon <will@kernel.org>
    0fddb79b
vmlinux.lds.S 9.13 KB