CeDOS - link.txt

link.txt (view raw)

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!");