From aad1de90553b9581b3dd5b02952c60280ab4bf71 Mon Sep 17 00:00:00 2001 From: Legolas Date: Sun, 18 Feb 2007 23:07:59 +0000 Subject: [PATCH] * changes in linker script and gcc handling git-svn-id: trunk@6556 - --- compiler/systems/t_gba.pas | 477 +++++++++++++++++++------------------ compiler/systems/t_nds.pas | 9 +- 2 files changed, 250 insertions(+), 236 deletions(-) diff --git a/compiler/systems/t_gba.pas b/compiler/systems/t_gba.pas index a4d60595ea..2de49cd77e 100644 --- a/compiler/systems/t_gba.pas +++ b/compiler/systems/t_gba.pas @@ -75,15 +75,17 @@ Var s,s1,s2 : TCmdStr; prtobj, cprtobj : string[80]; - linklibc : boolean; + linklibc, + linklibgcc : boolean; found1, found2 : boolean; begin WriteResponseFile:=False; linklibc:=(SharedLibFiles.Find('c')<>nil); + linklibgcc:=(SharedLibFiles.Find('gcc')<>nil); prtobj:='prt0'; cprtobj:='cprt0'; - if linklibc then + if (linklibc or linklibgcc) then prtobj:=cprtobj; { Open link.res file } @@ -117,11 +119,15 @@ begin { try to add crti and crtbegin if linking to C } if linklibc then begin - if librarysearchpath.FindFile('crtbegin.o',false,s) then - LinkRes.AddFileName(s); if librarysearchpath.FindFile('crti.o',false,s) then LinkRes.AddFileName(s); end; + if linklibgcc then + begin + if librarysearchpath.FindFile('crtbegin.o',false,s) then + LinkRes.AddFileName(s); + end; + while not ObjectFiles.Empty do begin @@ -158,6 +164,7 @@ begin { Write sharedlibraries like -l, also add the needed dynamic linker here to be sure that it gets linked this is needed for glibc2 systems (PFV) } linklibc:=false; + linklibgcc:=false; while not SharedLibFiles.Empty do begin S:=SharedLibFiles.GetFirst; @@ -172,14 +179,19 @@ begin begin LinkRes.Add('-l'+s); linklibc:=true; + linklibgcc:=true; end; end; { be sure that libc&libgcc is the last lib } + if linklibgcc then + begin + LinkRes.Add('-lgcc'); + end; if linklibc then begin LinkRes.Add('-lc'); - LinkRes.Add('-lgcc'); end; + end else begin @@ -192,15 +204,23 @@ begin end; { objects which must be at the end } - if linklibc then + if linklibgcc then begin found1:=librarysearchpath.FindFile('crtend.o',false,s1); - found2:=librarysearchpath.FindFile('crtn.o',false,s2); - if found1 or found2 then + if found1 then begin LinkRes.Add('INPUT('); if found1 then LinkRes.AddFileName(s1); + LinkRes.Add(')'); + end; + end; + if linklibc then + begin + found2:=librarysearchpath.FindFile('crtn.o',false,s2); + if found2 then + begin + LinkRes.Add('INPUT('); if found2 then LinkRes.AddFileName(s2); LinkRes.Add(')'); @@ -262,263 +282,260 @@ begin add(''); add('MEMORY {'); add(''); - add('rom : ORIGIN = 0x08000000, LENGTH = 32M'); - add('iwram : ORIGIN = 0x03000000, LENGTH = 32K'); - add('ewram : ORIGIN = 0x02000000, LENGTH = 256K'); + add(' rom : ORIGIN = 0x08000000, LENGTH = 32M'); + add(' iwram : ORIGIN = 0x03000000, LENGTH = 32K'); + add(' ewram : ORIGIN = 0x02000000, LENGTH = 256K'); add('}'); add(''); - add('/*'); - add('__text_start = 0x8000000;'); - add('__eheap_end = 0x2040000;'); - add('__iwram_start = 0x3000000;'); - add('__iwram_end = 0x3008000;'); - add(''); - add('__sp_irq = __iwram_end - 0x100;'); - add('__sp_usr = __sp_irq - 0x100;'); - add('*/'); - add('__text_start = ORIGIN(rom);'); - add('/* __eheap_end = ORIGIN(ewram) + 0x40000; */'); - add('__eheap_end = ORIGIN(ewram) + LENGTH(ewram);'); - add('__iwram_start = ORIGIN(iwram);'); - add('/* __iwram_end = ORIGIN(iwram) + 0x8000; */'); - add('__iwram_end = ORIGIN(iwram) + LENGTH(iwram); '); - add('__sp_irq = __iwram_end - 0x100;'); - add('__sp_usr = __sp_irq - 0x100;'); - add(''); + add('__text_start = ORIGIN(rom);'); + add('__eheap_end = ORIGIN(ewram) + LENGTH(ewram);'); + add('__iwram_start = ORIGIN(iwram);'); + add('__iwram_top = ORIGIN(iwram) + LENGTH(iwram);;'); + add('__sp_irq = __iwram_top - 0x100;'); + add('__sp_usr = __sp_irq - 0x100;'); + add('__irq_flags = 0x03007ff8;'); add(''); add('SECTIONS'); add('{'); - add('. = __text_start;'); - add('.init :'); - add('{'); - add('KEEP (*(.init))'); - add('. = ALIGN(4);'); - add('} >rom =0xff'); + add(' . = __text_start;'); + add(' .init :'); + add(' {'); + add(' KEEP (*(.init))'); + add(' . = ALIGN(4);'); + add(' } >rom =0xff'); add(''); - add('.plt :'); - add('{'); - add('*(.plt)'); - add('. = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); - add('} >rom'); + add(' .plt :'); + add(' {'); + add(' *(.plt)'); + add(' . = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); + add(' } >rom'); add(''); - add('.text : /* ALIGN (4): */'); - add('{'); - add('*(EXCLUDE_FILE (*.iwram*) .text)'); - add('*(.text.*)'); - add('*(.stub)'); - add('/* .gnu.warning sections are handled specially by elf32.em. */'); - add('*(.gnu.warning)'); - add('*(.gnu.linkonce.t*)'); - add('*(.glue_7)'); - add('*(.glue_7t)'); - add('. = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); - add('} >rom = 0xff'); + add(' .text : /* ALIGN (4): */'); + add(' {'); + add(' *(EXCLUDE_FILE (*.iwram*) .text)'); + add(' *(.text.*)'); + add(' *(.stub)'); + add(' /* .gnu.warning sections are handled specially by elf32.em. */'); + add(' *(.gnu.warning)'); + add(' *(.gnu.linkonce.t*)'); + add(' *(.glue_7)'); + add(' *(.glue_7t)'); + add(' . = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); + add(' } >rom = 0xff'); add(''); - add('__text_end = .;'); - add('.fini :'); - add('{'); - add('KEEP (*(.fini))'); - add('. = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); - add('} >rom =0'); + add(' __text_end = .;'); + add(' .fini :'); + add(' {'); + add(' KEEP (*(.fini))'); + add(' . = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); + add(' } >rom =0'); add(''); - add('.rodata :'); - add('{'); - add('*(.rodata)'); - add('*all.rodata*(*)'); - add('*(.roda)'); - add('*(.rodata.*)'); - add('*(.gnu.linkonce.r*)'); - add('SORT(CONSTRUCTORS)'); - add('. = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); - add('} >rom = 0xff'); + add(' .rodata :'); + add(' {'); + add(' *(.rodata)'); + add(' *all.rodata*(*)'); + add(' *(.roda)'); + add(' *(.rodata.*)'); + add(' *(.gnu.linkonce.r*)'); + add(' SORT(CONSTRUCTORS)'); + add(' . = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); + add(' } >rom = 0xff'); + add(' .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >rom'); + add(' __exidx_start = .;'); + add(' .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >rom'); + add(' __exidx_end = .;'); add(''); - add('.ctors :'); - add('{'); - add('/* gcc uses crtbegin.o to find the start of the constructors, so'); - add('we make sure it is first. Because this is a wildcard, it'); - add('doesn''t matter if the user does not actually link against'); - add('crtbegin.o; the linker won''t look for a file to match a'); - add('wildcard. The wildcard also means that it doesn''t matter which'); - add('directory crtbegin.o is in. */'); - add('KEEP (*crtbegin.o(.ctors))'); - add('KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))'); - add('KEEP (*(SORT(.ctors.*)))'); - add('KEEP (*(.ctors))'); - add('. = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); - add('} >rom = 0'); + add(' .ctors :'); + add(' {'); + add(' /* gcc uses crtbegin.o to find the start of the constructors, so'); + add(' we make sure it is first. Because this is a wildcard, it'); + add(' doesn''t matter if the user does not actually link against'); + add(' crtbegin.o; the linker won''t look for a file to match a'); + add(' wildcard. The wildcard also means that it doesn''t matter which'); + add(' directory crtbegin.o is in. */'); + add(' KEEP (*crtbegin.o(.ctors))'); + add(' KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))'); + add(' KEEP (*(SORT(.ctors.*)))'); + add(' KEEP (*(.ctors))'); + add(' . = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); + add(' } >rom = 0'); add(''); - add('.dtors :'); - add('{'); - add('KEEP (*crtbegin.o(.dtors))'); - add('KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))'); - add('KEEP (*(SORT(.dtors.*)))'); - add('KEEP (*(.dtors))'); - add('. = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); - add('} >rom = 0'); + add(' .dtors :'); + add(' {'); + add(' KEEP (*crtbegin.o(.dtors))'); + add(' KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))'); + add(' KEEP (*(SORT(.dtors.*)))'); + add(' KEEP (*(.dtors))'); + add(' . = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); + add(' } >rom = 0'); add(''); - add('.jcr : { KEEP (*(.jcr)) } >rom '); add(''); - add('.eh_frame :'); - add('{'); - add('KEEP (*(.eh_frame))'); - add('. = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); - add('} >rom = 0'); + add(' .eh_frame :'); + add(' {'); + add(' KEEP (*(.eh_frame))'); + add(' . = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); + add(' } >rom = 0'); add(''); - add('.gcc_except_table :'); - add('{'); - add('*(.gcc_except_table)'); - add('. = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); - add('} >rom = 0'); + add(' .gcc_except_table :'); + add(' {'); + add(' *(.gcc_except_table)'); + add(' . = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); + add(' } >rom = 0'); add(''); - add('__iwram_lma = .;'); + add(' __iwram_lma = .;'); add(''); - add('.iwram __iwram_start : AT (__iwram_lma)'); - add('{'); - add('__iwram_start = ABSOLUTE(.) ;'); - add('*(.iwram)'); - add('*iwram.*(.text)'); - add('. = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); - add('} >iwram = 0xff'); + add(' .iwram __iwram_start : AT (__iwram_lma)'); + add(' {'); + add(' __iwram_start = ABSOLUTE(.) ;'); + add(' *(.iwram)'); + add(' *iwram.*(.text)'); + add(' . = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); + add(' __iwram_end = ABSOLUTE(.) ;'); + add(' } >iwram = 0xff'); add(''); - add('__data_lma = __iwram_lma + SIZEOF(.iwram) ;'); - add('__iwram_end = . ;'); + add(' __data_lma = __iwram_lma + SIZEOF(.iwram) ;'); add(''); - add('.bss ALIGN(4) :'); - add('{'); - add('__bss_start = ABSOLUTE(.);'); - add('__bss_start__ = ABSOLUTE(.);'); - add('*(.dynbss)'); - add('*(.gnu.linkonce.b*)'); - add('*(.bss*)'); - add('*(COMMON)'); - add('. = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); - add('} >iwram'); + add(' .bss ALIGN(4) :'); + add(' {'); + add(' __bss_start = ABSOLUTE(.);'); + add(' __bss_start__ = ABSOLUTE(.);'); + add(' *(.dynbss)'); + add(' *(.gnu.linkonce.b*)'); + add(' *(.bss*)'); + add(' *(COMMON)'); + add(' . = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); + add(' __bss_end = ABSOLUTE(.) ;'); add(''); - add('__bss_end = . ;'); - add('__bss_end__ = . ;'); + add(' } >iwram'); add(''); - add('.data ALIGN(4) : AT (__data_lma)'); - add('{'); - add('__data_start = ABSOLUTE(.);'); - add('*(.data)'); - add('*(.data.*)'); - add('*(.gnu.linkonce.d*)'); - add('*(.fpc*)'); - add('CONSTRUCTORS'); - add('. = ALIGN(4);'); - add('} >iwram = 0xff'); + add(' __bss_end__ = __bss_end ;'); add(''); - add('__iwram_overlay_lma = __data_lma + SIZEOF(.data);'); + add(' .data ALIGN(4) : AT (__data_lma)'); + add(' {'); + add(' __data_start = ABSOLUTE(.);'); + add(' *(.data)'); + add(' *(.data.*)'); + add(' *(.gnu.linkonce.d*)'); + add(' *(.fpc*)'); + add(' CONSTRUCTORS'); + add(' . = ALIGN(4);'); + add(' } >iwram = 0xff'); add(''); - add('__data_end = .;'); - add('__iwram_overlay_start = . ;'); + add(' __preinit_lma = __data_lma + SIZEOF(.data);'); add(''); - add('OVERLAY ALIGN(4) : NOCROSSREFS AT (__iwram_overlay_lma)'); - add('{'); - add('.iwram0 { *(.iwram0) . = ALIGN(4);}'); - add('.iwram1 { *(.iwram1) . = ALIGN(4);}'); - add('.iwram2 { *(.iwram2) . = ALIGN(4);}'); - add('.iwram3 { *(.iwram3) . = ALIGN(4);}'); - add('.iwram4 { *(.iwram4) . = ALIGN(4);}'); - add('.iwram5 { *(.iwram5) . = ALIGN(4);}'); - add('.iwram6 { *(.iwram6) . = ALIGN(4);}'); - add('.iwram7 { *(.iwram7) . = ALIGN(4);}'); - add('.iwram8 { *(.iwram8) . = ALIGN(4);}'); - add('.iwram9 { *(.iwram9) . = ALIGN(4);}'); - add('}>iwram = 0xff'); + add(' PROVIDE (__preinit_array_start = .);'); + add(' .preinit_array : AT (__preinit_lma) { KEEP (*(.preinit_array)) } >iwram'); + add(' PROVIDE (__preinit_array_end = .);'); add(''); - add('__ewram_lma = LOADADDR(.iwram0) + SIZEOF(.iwram0)+SIZEOF(.iwram1)+SIZEOF(.iwram2)+SIZEOF(.iwram3)+SIZEOF(.iwram4)+SIZEOF(.iwram5)+SIZEOF(.iwram6)+SIZEOF(.iwram7)+SIZEOF(.iwram8)+SIZEOF(.iwram9);'); + add(' __init_lma = __preinit_lma + SIZEOF(.preinit_array);'); add(''); - add('__iwram_overlay_end = . ;'); - add('__iheap_start = . ;'); + add(' PROVIDE (__init_array_start = .);'); + add(' .init_array : AT (__init_lma) { KEEP (*(.init_array)) } >iwram'); + add(' PROVIDE (__init_array_end = .);'); + add(' PROVIDE (__fini_array_start = .);'); add(''); - add('__ewram_start = 0x2000000;'); - add('.ewram __ewram_start : AT (__ewram_lma)'); - add('{'); - add('*(.ewram)'); - add('. = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); - add('}>ewram = 0xff'); + add(' __fini_lma = __init_lma + SIZEOF(.init_array);'); add(''); - add('__ewram_overlay_lma = __ewram_lma + SIZEOF(.ewram);'); + add(' .fini_array : AT (__fini_lma) { KEEP (*(.fini_array)) } >iwram'); + add(' PROVIDE (__fini_array_end = .);'); add(''); - add('.sbss ALIGN(4):'); - add('{'); - add('__sbss_start = ABSOLUTE(.);'); - add('*(.sbss)'); - add('. = ALIGN(4);'); - add('} >ewram'); - add(' '); - add('__sbss_end = .;'); + add(' __jcr_lma = __fini_lma + SIZEOF(.fini_array);'); + add(' .jcr : AT (__jcr_lma) { KEEP (*(.jcr)) } >iwram'); add(''); - add('__ewram_end = . ;'); - add('__ewram_overlay_start = . ;'); + add(' __data_end = ABSOLUTE(.);'); + add(' __iwram_overlay_lma = __jcr_lma + SIZEOF(.jcr);'); add(''); - add('OVERLAY ALIGN(4): NOCROSSREFS AT (__ewram_overlay_lma)'); - add('{'); - add('.ewram0 { *(.ewram0) . = ALIGN(4);}'); - add('.ewram1 { *(.ewram1) . = ALIGN(4);}'); - add('.ewram2 { *(.ewram2) . = ALIGN(4);}'); - add('.ewram3 { *(.ewram3) . = ALIGN(4);}'); - add('.ewram4 { *(.ewram4) . = ALIGN(4);}'); - add('.ewram5 { *(.ewram5) . = ALIGN(4);}'); - add('.ewram6 { *(.ewram6) . = ALIGN(4);}'); - add('.ewram7 { *(.ewram7) . = ALIGN(4);}'); - add('.ewram8 { *(.ewram8) . = ALIGN(4);}'); - add('.ewram9 { *(.ewram9) . = ALIGN(4);}'); - add('}>ewram = 0xff'); + add(' __iwram_overlay_start = . ;'); add(''); - add('__pad_lma = LOADADDR(.ewram0) + SIZEOF(.ewram0)+SIZEOF(.ewram1)+SIZEOF(.ewram2)+SIZEOF(.ewram3)+SIZEOF(.ewram4)+SIZEOF(.ewram5)+SIZEOF(.ewram6)+SIZEOF(.ewram7)+SIZEOF(.ewram8)+SIZEOF(.ewram9);'); + add(' OVERLAY ALIGN(4) : NOCROSSREFS AT (__iwram_overlay_lma)'); + add(' {'); + add(' .iwram0 { *(.iwram0) . = ALIGN(4);}'); + add(' .iwram1 { *(.iwram1) . = ALIGN(4);}'); + add(' .iwram2 { *(.iwram2) . = ALIGN(4);}'); + add(' .iwram3 { *(.iwram3) . = ALIGN(4);}'); + add(' .iwram4 { *(.iwram4) . = ALIGN(4);}'); + add(' .iwram5 { *(.iwram5) . = ALIGN(4);}'); + add(' .iwram6 { *(.iwram6) . = ALIGN(4);}'); + add(' .iwram7 { *(.iwram7) . = ALIGN(4);}'); + add(' .iwram8 { *(.iwram8) . = ALIGN(4);}'); + add(' .iwram9 { *(.iwram9) . = ALIGN(4);}'); + add(' }>iwram = 0xff'); add(''); - add('/* EZF Advance strips trailing 0xff bytes, add a pad section so nothing important is removed */'); - add('.pad ALIGN(4) : AT (__pad_lma)'); - add('{'); - add('LONG(0x52416b64)'); - add('LONG(0x4d)'); - add('. = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); - add('} = 0xff'); + add(' __ewram_lma = __load_stop_iwram9;'); add(''); - add('__ewram_overlay_end = . ;'); - add('__eheap_start = . ;'); + add(' __iwram_overlay_end = . ;'); + add(' __iheap_start = . ;'); add(''); - add('_end = .;'); - add('__end__ = _end ; /* v1.3 */'); - add('PROVIDE (end = _end); /* v1.3 */'); + add(' __ewram_start = ORIGIN(ewram);'); + add(' .ewram __ewram_start : AT (__ewram_lma)'); + add(' {'); + add(' *(.ewram)'); + add(' . = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); + add(' }>ewram = 0xff'); add(''); - add('/* Stabs debugging sections. */'); - add('.stab 0 : { *(.stab) }'); - add('.stabstr 0 : { *(.stabstr) }'); - add('.stab.excl 0 : { *(.stab.excl) }'); - add('.stab.exclstr 0 : { *(.stab.exclstr) }'); - add('.stab.index 0 : { *(.stab.index) }'); - add('.stab.indexstr 0 : { *(.stab.indexstr) }'); - add('.comment 0 : { *(.comment) }'); - add('/* DWARF debug sections.'); - add('Symbols in the DWARF debugging sections are relative to the beginning'); - add('of the section so we begin them at 0. */'); - add('/* DWARF 1 */'); - add('.debug 0 : { *(.debug) }'); - add('.line 0 : { *(.line) }'); - add('/* GNU DWARF 1 extensions */'); - add('.debug_srcinfo 0 : { *(.debug_srcinfo) }'); - add('.debug_sfnames 0 : { *(.debug_sfnames) }'); - add('/* DWARF 1.1 and DWARF 2 */'); - add('.debug_aranges 0 : { *(.debug_aranges) }'); - add('.debug_pubnames 0 : { *(.debug_pubnames) }'); - add('/* DWARF 2 */'); - add('.debug_info 0 : { *(.debug_info) }'); - add('.debug_abbrev 0 : { *(.debug_abbrev) }'); - add('.debug_line 0 : { *(.debug_line) }'); - add('.debug_frame 0 : { *(.debug_frame) }'); - add('.debug_str 0 : { *(.debug_str) }'); - add('.debug_loc 0 : { *(.debug_loc) }'); - add('.debug_macinfo 0 : { *(.debug_macinfo) }'); - add('/* SGI/MIPS DWARF 2 extensions */'); - add('.debug_weaknames 0 : { *(.debug_weaknames) }'); - add('.debug_funcnames 0 : { *(.debug_funcnames) }'); - add('.debug_typenames 0 : { *(.debug_typenames) }'); - add('.debug_varnames 0 : { *(.debug_varnames) }'); - add('.stack 0x80000 : { _stack = .; *(.stack) }'); - add('/* These must appear regardless of . */'); + add(' __pad_lma = __ewram_lma + SIZEOF(.ewram);'); + add(''); + add(' .sbss ALIGN(4):'); + add(' {'); + add(' __sbss_start = ABSOLUTE(.);'); + add(' *(.sbss)'); + add(' . = ALIGN(4);'); + add(' __sbss_end = ABSOLUTE(.);'); + add(' } >ewram'); + add(''); + add(''); + add(' __ewram_end = __sbss_end ;'); + add(' __eheap_start = __sbss_end;'); + add(' __end__ = __sbss_end;'); + add(' end = __sbss_end;'); + add(''); + add(' /* EZF Advance strips trailing 0xff bytes, add a pad section so nothing important is removed */'); + add(' .pad ALIGN(4) : AT (__pad_lma)'); + add(' {'); + add(' LONG(0x52416b64)'); + add(' LONG(0x4d)'); + add(' . = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); + add(' } = 0xff'); + add(''); + add(''); + add(' /* Stabs debugging sections. */'); + add(' .stab 0 : { *(.stab) }'); + add(' .stabstr 0 : { *(.stabstr) }'); + add(' .stab.excl 0 : { *(.stab.excl) }'); + add(' .stab.exclstr 0 : { *(.stab.exclstr) }'); + add(' .stab.index 0 : { *(.stab.index) }'); + add(' .stab.indexstr 0 : { *(.stab.indexstr) }'); + add(' .comment 0 : { *(.comment) }'); + add(' /* DWARF debug sections.'); + add(' Symbols in the DWARF debugging sections are relative to the beginning'); + add(' of the section so we begin them at 0. */'); + add(' /* DWARF 1 */'); + add(' .debug 0 : { *(.debug) }'); + add(' .line 0 : { *(.line) }'); + add(' /* GNU DWARF 1 extensions */'); + add(' .debug_srcinfo 0 : { *(.debug_srcinfo) }'); + add(' .debug_sfnames 0 : { *(.debug_sfnames) }'); + add(' /* DWARF 1.1 and DWARF 2 */'); + add(' .debug_aranges 0 : { *(.debug_aranges) }'); + add(' .debug_pubnames 0 : { *(.debug_pubnames) }'); + add(' /* DWARF 2 */'); + add(' .debug_info 0 : { *(.debug_info) }'); + add(' .debug_abbrev 0 : { *(.debug_abbrev) }'); + add(' .debug_line 0 : { *(.debug_line) }'); + add(' .debug_frame 0 : { *(.debug_frame) }'); + add(' .debug_str 0 : { *(.debug_str) }'); + add(' .debug_loc 0 : { *(.debug_loc) }'); + add(' .debug_macinfo 0 : { *(.debug_macinfo) }'); + add(' /* SGI/MIPS DWARF 2 extensions */'); + add(' .debug_weaknames 0 : { *(.debug_weaknames) }'); + add(' .debug_funcnames 0 : { *(.debug_funcnames) }'); + add(' .debug_typenames 0 : { *(.debug_typenames) }'); + add(' .debug_varnames 0 : { *(.debug_varnames) }'); + add(' .stack 0x80000 : { _stack = .; *(.stack) }'); + add(' /* These must appear regardless of . */'); + add(' .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }'); + add(' .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) }'); + add(' /DISCARD/ : { *(.note.GNU-stack) }'); add('}'); end; diff --git a/compiler/systems/t_nds.pas b/compiler/systems/t_nds.pas index 7e781c1de0..4741453dd9 100644 --- a/compiler/systems/t_nds.pas +++ b/compiler/systems/t_nds.pas @@ -367,7 +367,7 @@ begin add(' . = ALIGN(4); /* REQUIRED. LD is flaky without it. */'); add(' } >ewram = 0xff'); add(' .jcr : { KEEP (*(.jcr)) } >ewram = 0'); - add(' .got : { *(.got.plt) *(.got) } >ewram = 0'); + add(' .got : { *(.got.plt) *(.got) *(.rel.got) } >ewram = 0'); add(''); add(' .ewram ALIGN(4) : '); add(' {'); @@ -490,13 +490,10 @@ begin add(''); add('MEMORY {'); add(''); - add(' rom : ORIGIN = 0x08000000, LENGTH = 32M'); - add(' iwram : ORIGIN = 0x03800000, LENGTH = 64K'); - add(' ewram : ORIGIN = 0x02040000, LENGTH = 4M'); + add(' rom : ORIGIN = 0x08000000, LENGTH = 32M'); + add(' iwram : ORIGIN = 0x037f8000, LENGTH = 96K'); add('}'); add(''); - add('__ewram_start = ORIGIN(ewram);'); - add('__eheap_end = ORIGIN(ewram)+ LENGTH(ewram);'); add('__iwram_start = ORIGIN(iwram);'); add('__iwram_top = ORIGIN(iwram)+ LENGTH(iwram);'); add('__sp_irq = __iwram_top - 0x60;');