linux/arch/x86/realmode/rm/realmode.lds.S
Nick Desaulniers 6a181e3339 x86/realmode: Explicitly set entry point via ENTRY in linker script
Linking with ld.lld via

$ make LD=ld.lld

produces the warning:

  ld.lld: warning: cannot find entry symbol _start; defaulting to 0x1000

Linking with ld.bfd shows the default entry is 0x1000:

$ readelf -h arch/x86/realmode/rm/realmode.elf | grep Entry
  Entry point address:               0x1000

While ld.lld is being pedantic, just set the entry point explicitly,
instead of depending on the implicit default. The symbol pa_text_start
refers to the start of the .text section, which may not be at 0x1000 if
the preceding sections listed in arch/x86/realmode/rm/realmode.lds.S
were large enough. This matches behavior in arch/x86/boot/setup.ld.

Reported-by: Sedat Dilek <sedat.dilek@gmail.com>
Suggested-by: Borislav Petkov <bp@alien8.de>
Suggested-by: Peter Smith <Peter.Smith@arm.com>
Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: clang-built-linux@googlegroups.com
Cc: grimar@accesssoftek.com
Cc: Ingo Molnar <mingo@redhat.com>
Cc: maskray@google.com
Cc: ruiu@google.com
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: x86-ml <x86@kernel.org>
Link: https://lkml.kernel.org/r/20190925180908.54260-1-ndesaulniers@google.com
Link: https://github.com/ClangBuiltLinux/linux/issues/216
2019-10-01 22:13:17 +02:00

79 lines
918 B
ArmAsm

/* SPDX-License-Identifier: GPL-2.0 */
/*
* realmode.lds.S
*
* Linker script for the real-mode code
*/
#include <asm/page_types.h>
#undef i386
OUTPUT_FORMAT("elf32-i386")
OUTPUT_ARCH(i386)
ENTRY(pa_text_start)
SECTIONS
{
real_mode_seg = 0;
. = 0;
.header : {
pa_real_mode_base = .;
*(.header)
}
. = ALIGN(4);
.rodata : {
*(.rodata)
*(.rodata.*)
. = ALIGN(16);
video_cards = .;
*(.videocards)
video_cards_end = .;
}
. = ALIGN(PAGE_SIZE);
pa_text_start = .;
.text : {
*(.text)
*(.text.*)
}
.text32 : {
*(.text32)
*(.text32.*)
}
.text64 : {
*(.text64)
*(.text64.*)
}
pa_ro_end = .;
. = ALIGN(PAGE_SIZE);
.data : {
*(.data)
*(.data.*)
}
. = ALIGN(128);
.bss : {
*(.bss*)
}
/* End signature for integrity checking */
. = ALIGN(4);
.signature : {
*(.signature)
}
/DISCARD/ : {
*(.note*)
*(.debug*)
*(.eh_frame*)
}
#include "pasyms.h"
}