summaryrefslogtreecommitdiff
path: root/compiler/systems/t_nds.pas
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/systems/t_nds.pas')
-rw-r--r--compiler/systems/t_nds.pas142
1 files changed, 67 insertions, 75 deletions
diff --git a/compiler/systems/t_nds.pas b/compiler/systems/t_nds.pas
index 16eab29b5e..93828c28aa 100644
--- a/compiler/systems/t_nds.pas
+++ b/compiler/systems/t_nds.pas
@@ -82,12 +82,14 @@ Var
linklibc,
linklibgcc : boolean;
found1,
- found2 : boolean;
+ found2 : boolean;
begin
WriteResponseFile:=False;
linklibc:=(SharedLibFiles.Find('c')<>nil);
linklibgcc:=(SharedLibFiles.Find('gcc')<>nil);
-
+
+ prtobj:='';
+ cprtobj:='';
case apptype of
app_arm9:
begin
@@ -243,20 +245,19 @@ begin
begin
if apptype=app_arm9 then //ARM9
begin
- add('OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")');
- add('OUTPUT_ARCH(arm)');
- add('ENTRY(_start)');
- add('');
add('MEMORY {');
- add('');
add(' rom : ORIGIN = 0x08000000, LENGTH = 32M');
add(' ewram : ORIGIN = 0x02000000, LENGTH = 4M - 4k');
add(' dtcm : ORIGIN = 0x0b000000, LENGTH = 16K');
- add(' vectors : ORIGIN = 0x01000000, LENGTH = 256');
- add(' itcm : ORIGIN = 0x01000100, LENGTH = 32K - 256');
+ add(' vectors : ORIGIN = 0x01000000, LENGTH = 256');
+ add(' itcm : ORIGIN = 0x01000100, LENGTH = 32K - 256');
add('}');
add('');
- add('__vectors_start = ORIGIN(vectors);');
+ add('OUTPUT_ARCH(arm)');
+ add('OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")');
+ add('ENTRY(_start)');
+ add('');
+ add('__vectors_start = ORIGIN(vectors);');
add('__itcm_start = ORIGIN(itcm);');
add('__ewram_end = ORIGIN(ewram) + LENGTH(ewram);');
add('__eheap_end = ORIGIN(ewram) + LENGTH(ewram);');
@@ -276,7 +277,7 @@ begin
add(' __text_start = . ;');
add(' KEEP (*(.init))');
add(' . = ALIGN(4); /* REQUIRED. LD is flaky without it. */');
- add(' } >ewram = 0xff');
+ add(' } >ewram = 0xff');
add('');
add(' .plt : { *(.plt) } >ewram = 0xff');
add('');
@@ -312,36 +313,40 @@ begin
add(' . = ALIGN(4); /* REQUIRED. LD is flaky without it. */');
add(' } >ewram = 0xff');
add('');
- add(' .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >ewram');
- add(' __exidx_start = .;');
- add(' .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >ewram');
- add(' __exidx_end = .;');
- add(' /* Ensure the __preinit_array_start label is properly aligned. We');
- add(' could instead move the label definition inside the section, but');
- add(' the linker would then create the section even if it turns out to');
- add(' be empty, which isn''t pretty. */');
- add(' . = ALIGN(32 / 8);');
- add(' PROVIDE (__preinit_array_start = .);');
- add(' .preinit_array : { KEEP (*(.preinit_array)) } >ewram = 0xff');
- add(' PROVIDE (__preinit_array_end = .);');
- add(' PROVIDE (__init_array_start = .);');
- add(' .init_array :');
- add(' {');
- add(' KEEP (*(SORT(.init_array.*)))');
- add(' KEEP (*(.init_array))');
- add(' } >ewram = 0xff');
- add(' PROVIDE (__init_array_end = .);');
- add(' PROVIDE (__fini_array_start = .);');
- add(' .fini_array :');
- add(' {');
- add(' KEEP (*(.fini_array))');
- add(' KEEP (*(SORT(.fini_array.*)))');
- add(' } >ewram = 0xff');
- add(' PROVIDE (__fini_array_end = .);');
+ add(' .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >ewram');
+ add(' __exidx_start = .;');
+ add(' ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >ewram');
+ add(' __exidx_end = .;');
+ add('');
+ add(' /* Ensure the __preinit_array_start label is properly aligned. We');
+ add(' could instead move the label definition inside the section, but');
+ add(' the linker would then create the section even if it turns out to');
+ add(' be empty, which isn''t pretty. */');
+ add('');
+ add(' . = ALIGN(32 / 8);');
+ add('');
+ add(' PROVIDE (__preinit_array_start = .);');
+ add(' .preinit_array : { KEEP (*(.preinit_array)) } >ewram = 0xff');
+ add(' PROVIDE (__preinit_array_end = .);');
+ add(' PROVIDE (__init_array_start = .);');
+ add(' .init_array :');
+ add(' {');
+ add(' KEEP (*(SORT(.init_array.*)))');
+ add(' KEEP (*(.init_array))');
+ add(' } >ewram = 0xff');
+ add(' PROVIDE (__init_array_end = .);');
+ add(' PROVIDE (__fini_array_start = .);');
+ add(' .fini_array :');
+ add(' {');
+ add(' KEEP (*(.fini_array))');
+ add(' KEEP (*(SORT(.fini_array.*)))');
+ add(' } >ewram = 0xff');
+ add('');
+ add(' PROVIDE (__fini_array_end = .);');
add('');
add(' .ctors :');
add(' {');
- add(' /* gcc uses crtbegin.o to find the start of the constructors, so');
+ 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');
@@ -392,7 +397,6 @@ begin
add(' *(.data)');
add(' *(.data.*)');
add(' *(.gnu.linkonce.d*)');
- add(' *(.fpc*)');
add(' CONSTRUCTORS');
add(' . = ALIGN(4);');
add(' __data_end = ABSOLUTE(.) ;');
@@ -408,7 +412,7 @@ begin
add(' *(.dtcm.*)');
add(' . = ALIGN(4);');
add(' __dtcm_end = ABSOLUTE(.);');
- add(' } >dtcm = 0xff');
+ add(' } >dtcm = 0xff');
add('');
add('');
add(' __itcm_lma = __dtcm_lma + SIZEOF(.dtcm);');
@@ -420,29 +424,27 @@ begin
add(' . = ALIGN(4);');
add(' __itcm_end = ABSOLUTE(.);');
add(' } >itcm = 0xff');
+ add(' ');
+ add(' __vectors_lma = __itcm_lma + SIZEOF(.itcm);');
add('');
-
- add(' __vectors_lma = __itcm_lma + SIZEOF(.itcm);');
- add(' .vectors __vectors_start : AT (__vectors_lma)');
- add(' {');
- add(' *(.vectors)');
- add(' *vectors.*(.text)');
- add(' . = ALIGN(4);');
- add(' __vectors_end = ABSOLUTE(.);');
- add(' } >vectors = 0xff');
- add('');
- add(' .sbss __dtcm_end (NOLOAD):');
+ add(' .vectors __vectors_start : AT (__vectors_lma)');
+ add(' {');
+ add(' *(.vectors)');
+ add(' *vectors.*(.text)');
+ add(' . = ALIGN(4);');
+ add(' __vectors_end = ABSOLUTE(.);');
+ add(' } >vectors = 0xff');
+ add(' ');
+ add(' .sbss __dtcm_end (NOLOAD): ');
add(' {');
add(' __sbss_start = ABSOLUTE(.);');
add(' __sbss_start__ = ABSOLUTE(.);');
add(' *(.sbss)');
add(' . = ALIGN(4); /* REQUIRED. LD is flaky without it. */');
add(' __sbss_end = ABSOLUTE(.);');
- add(' } >dtcm');
- add('');
+ add(' } >dtcm ');
add('');
- add('');
- add(' .bss __bss_vma (NOLOAD):');
+ add(' .bss __bss_vma (NOLOAD): ');
add(' {');
add(' __bss_start = ABSOLUTE(.);');
add(' __bss_start__ = ABSOLUTE(.);');
@@ -453,7 +455,8 @@ begin
add(' . = ALIGN(4); /* REQUIRED. LD is flaky without it. */');
add(' __bss_end__ = ABSOLUTE(.) ;');
add(' __end__ = ABSOLUTE(.) ;');
- add(' } AT>ewram');
+ add(' } AT>ewram ');
+ add('');
add('');
add('');
add(' /* Stabs debugging sections. */');
@@ -492,6 +495,7 @@ begin
add(' .stack 0x80000 : { _stack = .; *(.stack) }');
add(' /* These must appear regardless of . */');
add('}');
+ add('');
end;
if apptype=app_arm7 then
begin
@@ -501,12 +505,13 @@ begin
add('');
add('MEMORY {');
add('');
- add(' rom : ORIGIN = 0x08000000, LENGTH = 32M');
- add(' iwram : ORIGIN = 0x037f8000, LENGTH = 96K');
+ add(' rom : ORIGIN = 0x08000000, LENGTH = 32M');
+ add(' iwram : ORIGIN = 0x037f8000, LENGTH = 96K ');
add('}');
add('');
add('__iwram_start = ORIGIN(iwram);');
add('__iwram_top = ORIGIN(iwram)+ LENGTH(iwram);');
+ add('');
add('__sp_irq = __iwram_top - 0x100;');
add('__sp_svc = __sp_irq - 0x100;');
add('__sp_usr = __sp_svc - 0x100;');
@@ -527,9 +532,8 @@ begin
add('');
add(' .text : /* ALIGN (4): */');
add(' {');
- add('');
- add(' *(.text .stub .text.* .gnu.linkonce.t.*)');
- add(' KEEP (*(.text.*personality*))');
+ add(' *(.text .stub .text.* .gnu.linkonce.t.*)');
+ add(' KEEP (*(.text.*personality*))');
add(' /* .gnu.warning sections are handled specially by elf32.em. */');
add(' *(.gnu.warning)');
add(' *(.glue_7t) *(.glue_7) *(.vfp11_veneer)');
@@ -612,30 +616,16 @@ begin
add(' .jcr : { KEEP (*(.jcr)) } >iwram = 0');
add(' .got : { *(.got.plt) *(.got) } >iwram = 0');
add('');
- add('');
- add(' .iwram ALIGN(4) :');
- 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('');
add(' .data ALIGN(4) : {');
add(' __data_start = ABSOLUTE(.);');
add(' *(.data)');
add(' *(.data.*)');
add(' *(.gnu.linkonce.d*)');
- add(' *(.fpc*)');
add(' CONSTRUCTORS');
add(' . = ALIGN(4);');
add(' __data_end = ABSOLUTE(.) ;');
add(' } >iwram = 0xff');
add('');
- add('');
- add('');
add(' .bss ALIGN(4) :');
add(' {');
add(' __bss_start = ABSOLUTE(.);');
@@ -714,6 +704,8 @@ begin
StripStr:='';
MapStr:='';
DynLinkStr:='';
+ GCSectionsStr:='';
+ preName:='';
case apptype of
app_arm9: preName:='.nef';
app_arm7: preName:='.nlf';