blob: 36202f91c74020c2ce8001f9c310531678eecf1c [file] [log] [blame]
/* Copyright 2018 The Fuchsia Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/*
* This is the linker script for the final load image of the kernel. The
* entire thing was assembled into a single .text section in one .o file
* (see kernel/$ARCH/image.S). The purpose of this link is to resolve
* symbols used in image.S but defined in the kernel proper. That's made
* possible by using ld's --just-symbols switch to copy the symbols from
* the kernel proper into this link. That's how the boot loader headers in
* image.S can encode things like the entry point address, the exact load
* image size including KASLR fixup code, and the "end of .bss" memory
* reservation size.
*
* Boot loaders use only the raw binary load image extracted from this
* link, not the ELF file itself; image.S encodes the platform-specific
* headers the boot loaders look for at the beginning of the raw binary.
* Setting the .text address to its physical address is nice for looking at
* the ELF file and debugging the boot sequence, but it has no effect on
* the load image. However, other loaders (e.g. qemu) actually use the ELF
* file container of the load image to guide their loading. So we need
* this linker script to produce a PT_LOAD with the right p_paddr.
*/
ENTRY(IMAGE_ELF_ENTRY)
SECTIONS {
. = IMAGE_LOAD_START;
.load_image : {
KEEP(*(.text))
/*
* This includes the fixup code, which overlaps the bss.
*/
IMAGE_LOAD_END = .;
/*
* This is the end of the kernel load image proper, where the bss
* starts at runtime and the fixup code starts in the image.
*/
ASSERT(ABSOLUTE(IMAGE_LOAD_KERNEL_END) < ABSOLUTE(IMAGE_LOAD_END),
"image symbols bad");
} :load_image
/*
* This is the high bound of the address range that must be reserved.
* Since the fixups and the bss overlap and are both of varying sizes,
* this might be past IMAGE_LOAD_END (more bss than fixups) or vice versa.
*/
IMAGE_RESERVE_END = IMAGE_MEMORY_END + IMAGE_RESERVE_SIZE;
/*
* When a boot loader is actually using the ELF headers, it needs to
* know how much memory to reserve after the load image (p_filesz is
* the load image, and p_memsz > p_filesz to indicate the extra space
* to reserve). This ensures that the segment has the right p_memsz.
*/
.bss : {
. = MAX(ABSOLUTE(IMAGE_RESERVE_END), ABSOLUTE(.));
ASSERT(ABSOLUTE(.) >= ABSOLUTE(IMAGE_RESERVE_END), "image layout bad");
}
}
PHDRS {
load_image PT_LOAD FLAGS(7); /* PF_R|PF_W|PF_X */
}