| /* 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 */ |
| } |