/* GP32 Linker Script v1.1 by Jeff F */ /* v1.0 - Original release */ /* v1.1 - Cleaned up and added MEMORY command */ /* This file is released into the public domain */ /* for commercial or non-commercial use with no */ /* restrictions placed upon it. */ /* NOTE!!!: This linker script defines the RAM */ /* start addresses. In order for it to work */ /* properly, remove -Ttext and -Tbss linker */ /* options from your makefile if they are */ /* present. */ /* You can use the following to view section */ /* addresses in your .elf file: */ /* objdump -h file.elf */ /* Please note that empty sections may incorrectly*/ /* list the lma address as the vma address for */ /* some versions of objdump. */ OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") OUTPUT_ARCH(arm) ENTRY(_start) SEARCH_DIR(/bin/gp32lib); /* Then use it like this: IWRAMHEAP */ /* The linker script function "var1 += var2;" sometimes */ /* reports incorrect values in the *.map file but the */ /* actual value it calculates is usually, if not always, */ /* correct. If you leave out the ". = ALIGN(4);" at the */ /* end of each section then the return value of SIZEOF() */ /* is sometimes incorrect and "var1 += var2;" appears to */ /* not work as well. "var1 += var2" style functions are */ /* avoided below as a result. */ /* The linker script MEMORY directive is not used here due */ /* to the fact that __text_start is not always a fixed value. */ MEMORY { ram : ORIGIN = 0xc000000, LENGTH = 8M } SECTIONS { .text : /* ALIGN (4): */ { __text_start = . ; *(EXCLUDE_FILE (*text.iwram*) .text) *(.text.*) *(.stub) /* .gnu.warning sections are handled specially by elf32.em. */ *(.gnu.warning) *(.gnu.linkonce.t*) *(.glue_7) *(.glue_7t) . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ } >ram = 0xff __text_end = . ; .rodata : { *(.rodata) *all.rodata*(*) *(.roda) *(.rodata.*) *(.gnu.linkonce.r*) SORT(CONSTRUCTORS) . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ } >ram = 0xff .ctors : { /* gcc uses crtbegin.o to find the start of the constructors, so we make sure it is first. Because this is a wildcard, it doesn't matter if the user does not actually link against crtbegin.o; the linker won't look for a file to match a wildcard. The wildcard also means that it doesn't matter which directory crtbegin.o is in. */ KEEP (*crtbegin.o(.ctors)) KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ } >ram = 0 .dtors : { KEEP (*crtbegin.o(.dtors)) KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ } >ram = 0 .eh_frame : { KEEP (*(.eh_frame)) . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ } >ram = 0 .gcc_except_table : { *(.gcc_except_table) . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ } >ram = 0 __ro_end = . ; .data ALIGN(4) : { __data_start = ABSOLUTE(.); *(.data) *(.data.*) *(.gnu.linkonce.d*) CONSTRUCTORS . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ } >ram = 0xff __data_end = . ; .bss ALIGN(4) : { __bss_start = ABSOLUTE(.); /* __bss_start__ = ABSOLUTE(.); */ *(.dynbss) *(.gnu.linkonce.b*) *(COMMON) . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ } > ram __bss_end = . ; __eheap_start = . ; /* Needed by DevKitAdvance. Start of malloc() heap for DKA. */ _end = . ; __end__ = . ; PROVIDE (end = _end); __eheap_end = . ; /* Stabs debugging sections. */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .comment 0 : { *(.comment) } /* 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) } .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) } .stack 0x80000 : { _stack = .; *(.stack) } /* These must appear regardless of . */ }