You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
3.4 KiB
128 lines
3.4 KiB
/* |
|
* 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 |
|
{ |
|
/* 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 = .); |
|
}
|
|
|