diff options
Diffstat (limited to 'libgloss/arm/arm.sc')
-rw-r--r-- | libgloss/arm/arm.sc | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/libgloss/arm/arm.sc b/libgloss/arm/arm.sc new file mode 100644 index 000000000..b6c813a3f --- /dev/null +++ b/libgloss/arm/arm.sc @@ -0,0 +1,146 @@ +# a linker script template. +# RAM - start of board's ram +# RAM_SIZE - size of board's ram +# ROM - start of board's rom +# ROM_SIZE - size of board's rom +# $1 whether to set _stack + +test "x$1" = "xyes" && SETSTACK=1 +test -z "${RAM}" && RAM=0x20000000 +if test -z "${ROM_SIZE:+1}" ; then + NOROM=1 +else + test -z "${ROM}" && ROM=0 +fi + +cat <<EOF +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", + "elf32-littlearm") +OUTPUT_ARCH(arm) +ENTRY(_start) +__DYNAMIC = 0; + +MEMORY +{ + ${ROM:+rom (rx) : ORIGIN = ${ROM}, LENGTH = ${ROM_SIZE}} + ram (rwx) : ORIGIN = ${RAM}, LENGTH = ${RAM_SIZE} +} + +/* Place the stack at the end of memory, unless specified otherwise. */ +${SETSTACK:+PROVIDE (__stack = ${RAM} + ${RAM_SIZE});} + +SECTIONS +{ + .text : + { + CREATE_OBJECT_SYMBOLS + ${ROM:+*(.isr_vector)} + *(.text .text.*) + *(.plt) + *(.gnu.warning) + *(.glue_7t) *(.glue_7) + + . = ALIGN(0x4); + /* These are for running static constructors and destructors under ELF. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend.o(.ctors)) + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*crtend.o(.dtors)) + + *(.rodata .rodata.*) + + *(.gcc_except_table) + *(.eh_frame_hdr) + *(.eh_frame) + + *(.init) + *(.fini) + + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE_HIDDEN (__fini_array_end = .); + } >${ROM:+rom}${NOROM:+ram} + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } >${ROM:+rom}${NOROM:+ram} + __exidx_end = .; + _etext = .; + + .data : + { + __data_load = LOADADDR (.data); + __data_start = .; + *(.got.plt) *(.got) + *(.shdata) + *(.data .data.*) + . = ALIGN (4); + _edata = .; + } >ram ${ROM:+AT>rom} + + .bss : + { + __bss_start__ = . ; + *(.shbss) + *(.bss .bss.*) + *(COMMON) + . = ALIGN (8); + __bss_end__ = .; + _end = .; + __end = _end; + PROVIDE(end = .); + } >ram ${ROM:+AT>rom} + + .stab 0 (NOLOAD) : + { + *(.stab) + } + + .stabstr 0 (NOLOAD) : + { + *(.stabstr) + } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) } + .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) } + /DISCARD/ : { *(.note.GNU-stack) ${NOROM:+*(.isr_vector)} } +} +EOF |