/* 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))
    } :load_image

    IMAGE_RESERVE_END = IMAGE_MEMORY_END +
        (DEFINED(IMAGE_RESERVE_SIZE) ? IMAGE_RESERVE_SIZE : 0);

    /*
     * 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 : {
        . += 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 */
}
