link.txt (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
OUTPUT_ARCH(i386)
OUTPUT_FORMAT(elf32-i386)
PAGE_SIZE = 1 << 12;
MEMORY
{
BOOT_STAGE1 : ORIGIN = 0x00007C00, LENGTH = 0x00000200
BOOT_STAGE2 : ORIGIN = 0x00010000, LENGTH = 0x00090000
KERNEL : ORIGIN = 0xC0000000, LENGTH = 0x30000000
APPLICATION : ORIGIN = 0x10000000, LENGTH = 0xB0000000
}
SECTIONS
{
BOOT_STAGE1 : AT(0x0000)
{
*/boot_stage1.o(.*)
. = 510;
BYTE(0x55)
BYTE(0xAA)
} >BOOT_STAGE1
BOOT_STAGE2 : AT(LOADADDR(BOOT_STAGE1) + SIZEOF(BOOT_STAGE1))
{
*/boot_stage2.o(.*)
} >BOOT_STAGE2
KERNEL : AT(LOADADDR(BOOT_STAGE2) + SIZEOF(BOOT_STAGE2))
{
*/kernel.o(.*)
*/kernel.o(.bss)
} >KERNEL
APPLICATION : AT(LOADADDR(KERNEL) + SIZEOF(KERNEL))
{
} >APPLICATION
.bss : AT(LOADADDR(APPLICATION) + SIZEOF(APPLICATION))
{
} >KERNEL
}
__SS_LMA = LOADADDR(BOOT_STAGE2);
__SS_VMA = ADDR(BOOT_STAGE2);
__SS_SIZE = SIZEOF(BOOT_STAGE2);
__KERNEL_LMA = LOADADDR(KERNEL);
__KERNEL_VMA = ADDR(KERNEL);
__KERNEL_SIZE = SIZEOF(KERNEL);
__APP_LMA = LOADADDR(APPLICATION);
__APP_VMA = ADDR(APPLICATION);
__APP_SIZE = SIZEOF(APPLICATION);
__KERNEL_STACK_ADDR = 0xC0400000;
ASSERT(__SS_SIZE + __KERNEL_SIZE + __APP_SIZE <= 0x48 * 0x200, "bootloader payload too big!");