Quellcode durchsuchen

+ basic avr linker script

git-svn-id: branches/avr@17292 -
florian vor 14 Jahren
Ursprung
Commit
610fa89484
1 geänderte Dateien mit 235 neuen und 1 gelöschten Zeilen
  1. 235 1
      compiler/systems/t_embed.pas

+ 235 - 1
compiler/systems/t_embed.pas

@@ -82,7 +82,7 @@ Var
 begin
   WriteResponseFile:=False;
   linklibc:=(SharedLibFiles.Find('c')<>nil);
-{$if defined(ARM) or defined(i386)}
+{$if defined(ARM) or defined(i386) or defined(AVR)}
   prtobj:='';
 {$else}
   prtobj:='prt0';
@@ -293,6 +293,7 @@ begin
       Add('_end = .;');
     end;
 {$endif ARM}
+
 {$ifdef i386}
   with linkres do
     begin
@@ -329,6 +330,239 @@ begin
     end;
 {$endif I386}
 
+{$ifdef AVR}
+  with linkres do
+    begin
+      Add('ENTRY(_START)');
+      Add('OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr")');
+      Add('OUTPUT_ARCH(avr:2)');
+      Add('MEMORY');
+      Add('{');
+      Add('  text      (rx)   : ORIGIN = 0, LENGTH = 8K');
+      Add('  data      (rw!x) : ORIGIN = 0x800060, LENGTH = 0xffa0');
+      Add('  eeprom    (rw!x) : ORIGIN = 0x810000, LENGTH = 64K');
+      Add('  fuse      (rw!x) : ORIGIN = 0x820000, LENGTH = 1K');
+      Add('  lock      (rw!x) : ORIGIN = 0x830000, LENGTH = 1K');
+      Add('  signature (rw!x) : ORIGIN = 0x840000, LENGTH = 1K');
+      Add('}');
+      Add('SECTIONS');
+      Add('{');
+      Add('  /* Read-only sections, merged into text segment: */');
+      Add('  .hash          : { *(.hash)		}');
+      Add('  .dynsym        : { *(.dynsym)		}');
+      Add('  .dynstr        : { *(.dynstr)		}');
+      Add('  .gnu.version   : { *(.gnu.version)	}');
+      Add('  .gnu.version_d   : { *(.gnu.version_d)	}');
+      Add('  .gnu.version_r   : { *(.gnu.version_r)	}');
+      Add('  .rel.init      : { *(.rel.init)		}');
+      Add('  .rela.init     : { *(.rela.init)	}');
+      Add('  .rel.text      :');
+      Add('    {');
+      Add('      *(.rel.text)');
+      Add('      *(.rel.text.*)');
+      Add('      *(.rel.gnu.linkonce.t*)');
+      Add('    }');
+      Add('  .rela.text     :');
+      Add('    {');
+      Add('      *(.rela.text)');
+      Add('      *(.rela.text.*)');
+      Add('      *(.rela.gnu.linkonce.t*)');
+      Add('    }');
+      Add('  .rel.fini      : { *(.rel.fini)		}');
+      Add('  .rela.fini     : { *(.rela.fini)	}');
+      Add('  .rel.rodata    :');
+      Add('    {');
+      Add('      *(.rel.rodata)');
+      Add('      *(.rel.rodata.*)');
+      Add('      *(.rel.gnu.linkonce.r*)');
+      Add('    }');
+      Add('  .rela.rodata   :');
+      Add('    {');
+      Add('      *(.rela.rodata)');
+      Add('      *(.rela.rodata.*)');
+      Add('      *(.rela.gnu.linkonce.r*)');
+      Add('    }');
+      Add('  .rel.data      :');
+      Add('    {');
+      Add('      *(.rel.data)');
+      Add('      *(.rel.data.*)');
+      Add('      *(.rel.gnu.linkonce.d*)');
+      Add('    }');
+      Add('  .rela.data     :');
+      Add('    {');
+      Add('      *(.rela.data)');
+      Add('      *(.rela.data.*)');
+      Add('      *(.rela.gnu.linkonce.d*)');
+      Add('    }');
+      Add('  .rel.ctors     : { *(.rel.ctors)	}');
+      Add('  .rela.ctors    : { *(.rela.ctors)	}');
+      Add('  .rel.dtors     : { *(.rel.dtors)	}');
+      Add('  .rela.dtors    : { *(.rela.dtors)	}');
+      Add('  .rel.got       : { *(.rel.got)		}');
+      Add('  .rela.got      : { *(.rela.got)		}');
+      Add('  .rel.bss       : { *(.rel.bss)		}');
+      Add('  .rela.bss      : { *(.rela.bss)		}');
+      Add('  .rel.plt       : { *(.rel.plt)		}');
+      Add('  .rela.plt      : { *(.rela.plt)		}');
+      Add('  /* Internal text space or external memory.  */');
+      Add('  .text   :');
+      Add('  {');
+      Add('    *(.vectors)');
+      Add('    KEEP(*(.vectors))');
+      Add('    /* For data that needs to reside in the lower 64k of progmem.  */');
+      Add('    *(.progmem.gcc*)');
+      Add('    *(.progmem*)');
+      Add('    . = ALIGN(2);');
+      Add('     __trampolines_start = . ;');
+      Add('    /* The jump trampolines for the 16-bit limited relocs will reside here.  */');
+      Add('    *(.trampolines)');
+      Add('    *(.trampolines*)');
+      Add('     __trampolines_end = . ;');
+      Add('    /* For future tablejump instruction arrays for 3 byte pc devices.');
+      Add('       We don't relax jump/call instructions within these sections.  */');
+      Add('    *(.jumptables)');
+      Add('    *(.jumptables*)');
+      Add('    /* For code that needs to reside in the lower 128k progmem.  */');
+      Add('    *(.lowtext)');
+      Add('    *(.lowtext*)');
+      Add('     __ctors_start = . ;');
+      Add('     *(.ctors)');
+      Add('     __ctors_end = . ;');
+      Add('     __dtors_start = . ;');
+      Add('     *(.dtors)');
+      Add('     __dtors_end = . ;');
+      Add('    KEEP(SORT(*)(.ctors))');
+      Add('    KEEP(SORT(*)(.dtors))');
+      Add('    /* From this point on, we don't bother about wether the insns are');
+      Add('       below or above the 16 bits boundary.  */');
+      Add('    *(.init0)  /* Start here after reset.  */');
+      Add('    KEEP (*(.init0))');
+      Add('    *(.init1)');
+      Add('    KEEP (*(.init1))');
+      Add('    *(.init2)  /* Clear __zero_reg__, set up stack pointer.  */');
+      Add('    KEEP (*(.init2))');
+      Add('    *(.init3)');
+      Add('    KEEP (*(.init3))');
+      Add('    *(.init4)  /* Initialize data and BSS.  */');
+      Add('    KEEP (*(.init4))');
+      Add('    *(.init5)');
+      Add('    KEEP (*(.init5))');
+      Add('    *(.init6)  /* C++ constructors.  */');
+      Add('    KEEP (*(.init6))');
+      Add('    *(.init7)');
+      Add('    KEEP (*(.init7))');
+      Add('    *(.init8)');
+      Add('    KEEP (*(.init8))');
+      Add('    *(.init9)  /* Call main().  */');
+      Add('    KEEP (*(.init9))');
+      Add('    *(.text)');
+      Add('    . = ALIGN(2);');
+      Add('    *(.text.*)');
+      Add('    . = ALIGN(2);');
+      Add('    *(.fini9)  /* _exit() starts here.  */');
+      Add('    KEEP (*(.fini9))');
+      Add('    *(.fini8)');
+      Add('    KEEP (*(.fini8))');
+      Add('    *(.fini7)');
+      Add('    KEEP (*(.fini7))');
+      Add('    *(.fini6)  /* C++ destructors.  */');
+      Add('    KEEP (*(.fini6))');
+      Add('    *(.fini5)');
+      Add('    KEEP (*(.fini5))');
+      Add('    *(.fini4)');
+      Add('    KEEP (*(.fini4))');
+      Add('    *(.fini3)');
+      Add('    KEEP (*(.fini3))');
+      Add('    *(.fini2)');
+      Add('    KEEP (*(.fini2))');
+      Add('    *(.fini1)');
+      Add('    KEEP (*(.fini1))');
+      Add('    *(.fini0)  /* Infinite loop after program termination.  */');
+      Add('    KEEP (*(.fini0))');
+      Add('     _etext = . ;');
+      Add('  }  > text');
+      Add('  .data	  : AT (ADDR (.text) + SIZEOF (.text))');
+      Add('  {');
+      Add('     PROVIDE (__data_start = .) ;');
+      Add('    *(.data)');
+      Add('    *(.data*)');
+      Add('    *(.rodata)  /* We need to include .rodata here if gcc is used */');
+      Add('    *(.rodata*) /* with -fdata-sections.  */');
+      Add('    *(.gnu.linkonce.d*)');
+      Add('    . = ALIGN(2);');
+      Add('     _edata = . ;');
+      Add('     PROVIDE (__data_end = .) ;');
+      Add('  }  > data');
+      Add('  .bss   : AT (ADDR (.bss))');
+      Add('  {');
+      Add('     PROVIDE (__bss_start = .) ;');
+      Add('    *(.bss)');
+      Add('    *(.bss*)');
+      Add('    *(COMMON)');
+      Add('     PROVIDE (__bss_end = .) ;');
+      Add('  }  > data');
+      Add('   __data_load_start = LOADADDR(.data);');
+      Add('   __data_load_end = __data_load_start + SIZEOF(.data);');
+      Add('  /* Global data not cleared after reset.  */');
+      Add('  .noinit  :');
+      Add('  {');
+      Add('     PROVIDE (__noinit_start = .) ;');
+      Add('    *(.noinit*)');
+      Add('     PROVIDE (__noinit_end = .) ;');
+      Add('     _end = . ;');
+      Add('     PROVIDE (__heap_start = .) ;');
+      Add('  }  > data');
+      Add('  .eeprom  :');
+      Add('  {');
+      Add('    *(.eeprom*)');
+      Add('     __eeprom_end = . ;');
+      Add('  }  > eeprom');
+      Add('  .fuse  :');
+      Add('  {');
+      Add('    KEEP(*(.fuse))');
+      Add('    KEEP(*(.lfuse))');
+      Add('    KEEP(*(.hfuse))');
+      Add('    KEEP(*(.efuse))');
+      Add('  }  > fuse');
+      Add('  .lock  :');
+      Add('  {');
+      Add('    KEEP(*(.lock*))');
+      Add('  }  > lock');
+      Add('  .signature  :');
+      Add('  {');
+      Add('    KEEP(*(.signature*))');
+      Add('  }  > signature');
+      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) *(.gnu.linkonce.wi.*) }');
+      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('}');
+{$end AVR}
+
   { Write and Close response }
   linkres.writetodisk;
   linkres.free;