Skip to content
  • George Rimar's avatar
    x86/build: Specify elf_i386 linker emulation explicitly for i386 objects · 927185c1
    George Rimar authored
    
    
    The kernel uses the OUTPUT_FORMAT linker script command in it's linker
    scripts. Most of the time, the -m option is passed to the linker with
    correct architecture, but sometimes (at least for x86_64) the -m option
    contradicts the OUTPUT_FORMAT directive.
    
    Specifically, arch/x86/boot and arch/x86/realmode/rm produce i386 object
    files, but are linked with the -m elf_x86_64 linker flag when building
    for x86_64.
    
    The GNU linker manpage doesn't explicitly state any tie-breakers between
    -m and OUTPUT_FORMAT. But with BFD and Gold linkers, OUTPUT_FORMAT
    overrides the emulation value specified with the -m option.
    
    LLVM lld has a different behavior, however. When supplied with
    contradicting -m and OUTPUT_FORMAT values it fails with the following
    error message:
    
      ld.lld: error: arch/x86/realmode/rm/header.o is incompatible with elf_x86_64
    
    Therefore, just add the correct -m after the incorrect one (it overrides
    it), so the linker invocation looks like this:
    
      ld -m elf_x86_64 -z max-page-size=0x200000 -m elf_i386 --emit-relocs -T \
        realmode.lds header.o trampoline_64.o stack.o reboot.o -o realmode.elf
    
    This is not a functional change for GNU ld, because (although not
    explicitly documented) OUTPUT_FORMAT overrides -m EMULATION.
    
    Tested by building x86_64 kernel with GNU gcc/ld toolchain and booting
    it in QEMU.
    
     [ bp: massage and clarify text. ]
    
    Suggested-by: default avatarDmitry Golovin <dima@golovin.in>
    Signed-off-by: default avatarGeorge Rimar <grimar@accesssoftek.com>
    Signed-off-by: default avatarTri Vo <trong@android.com>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Tested-by: default avatarTri Vo <trong@android.com>
    Tested-by: default avatarNick Desaulniers <ndesaulniers@google.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Michael Matz <matz@suse.de>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: morbo@google.com
    Cc: ndesaulniers@google.com
    Cc: ruiu@google.com
    Cc: x86-ml <x86@kernel.org>
    Link: https://lkml.kernel.org/r/20190111201012.71210-1-trong@android.com
    927185c1