/* * Linker script for running from internal SRAM on Compal phones * * This script is tailored specifically to the requirements imposed * on us by the Compal bootloader. * */ OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUTPUT_ARCH(arm) ENTRY(__start) MEMORY { /* E86 stacked flash 32mbit flash, 4mbit sram, DBB internal 256kb SRAM */ /* 0x800000-0x87ffff */ /* bump up because we have 32mbit instead of 16mbit */ /* compal-loaded binary: our text, initialized data */ LRAM (rw) : ORIGIN = 0x00800000, LENGTH = 0x00040000 TRAM (rw) : ORIGIN = 0x00840000, LENGTH = 0x00020000 /* compal-loaded binary: our unitialized data, stacks, heap */ IRAM (rw) : ORIGIN = 0x00860000, LENGTH = 0x00020000 /* E88 NOR flash 16mbits, SRAM 256 kb, DBB has 256kb internal SRAM */ /* 0x800000-0x83ffff */ /* compal-loaded binary: our text, initialized data */ /* LRAM (rw) : ORIGIN = 0x00800000, LENGTH = 0x00020000 TRAM (rw) : ORIGIN = 0x00820000, LENGTH = 0x00010000 */ /* compal-loaded binary: our unitialized data, stacks, heap */ /* IRAM (rw) : ORIGIN = 0x00830000, LENGTH = 0x00010000 */ } SECTIONS { . = 0x800000; /* romloader data section, contains passthru interrupt vectors */ .compal.loader (NOLOAD) : { . = 0x100; } > LRAM /* image signature (prepended by osmocon according to phone type) */ .compal.header (NOLOAD) : { . = 4; } > LRAM /* initialization code */ . = ALIGN(4); .text.start : { PROVIDE(__start = .); KEEP(*(.text.start)) *(.text.start) } > TRAM /* exception vectors from 0x80001c to 0x800034 */ .text.exceptions 0x80001c : AT (LOADADDR(.text.start) + SIZEOF(.text.start)) { KEEP(*(.text.exceptions)) * (.text.exceptions) . = ALIGN(4); } > LRAM PROVIDE(_exceptions = LOADADDR(.text.exceptions)); /* code */ . = ALIGN(4); .text (LOADADDR(.text.exceptions) + SIZEOF(.text.exceptions)) : AT (LOADADDR(.text.exceptions) + SIZEOF(.text.exceptions)) { /* regular code */ *(.text*) /* always-in-ram code */ *(.ramtext*) /* gcc voodoo */ *(.glue_7t) *(.glue_7) *(.vfp11_veneer) *(.v4_bx) . = ALIGN(4); } > TRAM PROVIDE(_text_start = LOADADDR(.text)); PROVIDE(_text_end = LOADADDR(.text) + SIZEOF(.text)); /* constructor pointers */ .ctors : { /* ctor count */ LONG(SIZEOF(.ctors) / 4 - 2) /* ctor pointers */ KEEP(*(SORT(.ctors))) /* end of list */ LONG(0) } > TRAM PROVIDE(_ctor_start = LOADADDR(.ctors)); PROVIDE(_ctor_end = LOADADDR(.ctors) + SIZEOF(.ctors)); /* destructor pointers */ .dtors : { /* dtor count */ LONG(SIZEOF(.dtors) / 4 - 2) /* dtor pointers */ KEEP(*(SORT(.dtors))) /* end of list */ LONG(0) } > TRAM PROVIDE(_dtor_start = LOADADDR(.dtors)); PROVIDE(_dtor_end = LOADADDR(.dtors) + SIZEOF(.dtors)); /* read-only data */ . = ALIGN(4); .rodata : { *(.rodata*) } > TRAM PROVIDE(_rodata_start = LOADADDR(.rodata)); PROVIDE(_rodata_end = LOADADDR(.rodata) + SIZEOF(.rodata)); /* initialized data */ . = ALIGN(4); .data : { *(.data) } > TRAM PROVIDE(_data_start = LOADADDR(.data)); PROVIDE(_data_end = LOADADDR(.data) + SIZEOF(.data)); /* pic offset tables */ . = ALIGN(4); .got : { *(.got) *(.got.plt) *(.igot.plt) *(.got) *(.igot) } > TRAM PROVIDE(_got_start = LOADADDR(.got)); PROVIDE(_got_end = LOADADDR(.got) + SIZEOF(.got)); /* uninitialized data */ .bss (NOLOAD) : { . = ALIGN(4); __bss_start = .; _sbss = ABSOLUTE(.); *(.bss) _ebss = ABSOLUTE(.); } > IRAM . = ALIGN(4); __bss_end = .; PROVIDE(_bss_start = __bss_start); PROVIDE(_bss_end = __bss_end); /* end of image */ . = ALIGN(4); _end = .; PROVIDE(end = .); }