Bladeren bron

* powerpc-amiga linker invocation fixes, and added a linker script required for VLink, courtesy of Frank Wille

git-svn-id: trunk@33506 -
Károly Balogh 9 jaren geleden
bovenliggende
commit
ea8322ee80
1 gewijzigde bestanden met toevoegingen van 107 en 2 verwijderingen
  1. 107 2
      compiler/systems/t_amiga.pas

+ 107 - 2
compiler/systems/t_amiga.pas

@@ -92,11 +92,11 @@ begin
    begin
     if not UseVLink then
      begin
-      ExeCmd[1]:='ld $DYNLINK $OPT -defsym=__amigaos4__=1 -d -q -n -o $EXE $RES';
+      ExeCmd[1]:='ld $DYNLINK $OPT -defsym=__amigaos4__=1 -d -q -N -o $STRIP $EXE $RES';
      end
     else
      begin
-      ExeCmd[1]:='vlink -b elf32amigaos $OPT $STRIP -o $EXE -T $RES';
+      ExeCmd[1]:='vlink -q -n -b elf32amigaos -P_start -P__amigaos4__ -nostdlib $OPT $STRIP -o $EXE -T $RES';
      end;
   end;
 end;
@@ -214,6 +214,111 @@ begin
     LinkRes.Add(')');
    end;
 
+  if (target_info.system = system_powerpc_amiga) and UseVLink then
+   begin
+    with linkres do
+     begin
+      { AmigaOS4-specific linker script from VBCC for VLink, with modifications,
+        courtesy of Frank Wille, used with his permission }
+      Add('SECTIONS');
+      Add('{');
+      Add('  . = 0x01000000 + SIZEOF_HEADERS;');
+      Add('  /* Read-only sections, merged into text segment: */');
+      Add('  .interp         : { *(.interp) }');
+      Add('  .hash           : { *(.hash) }');
+      Add('  .dynsym         : { *(.dynsym) }');
+      Add('  .dynstr         : { *(.dynstr) }');
+      Add('  .fpc            : { *(.fpc) }');
+      Add('  .gnu.version    : { *(.gnu.version) }');
+      Add('  .gnu.version_d  : { *(.gnu.version_d) }');
+      Add('  .gnu.version_r  : { *(.gnu.version_r) }');
+      Add('  .rela.dyn       : { *(.rela.dyn) }');
+      Add('  .rela.plt       : { *(.rela.plt) }');
+      Add('  .init           : { *(.init) }');
+      Add('  .text           : { *(.text .gnu.linkonce.t.*) }');
+      Add('  .fini           : { *(.fini) }');
+      Add('  .code68k        : { *(CODE text code) }');
+      Add('');
+      Add('  .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }');
+      Add('  .sdata2         : { *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) }');
+      Add('  .sbss2          : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) }');
+      Add('');
+      Add('  /* data segment: */');
+      Add('  . = ALIGN(16) + 0x10000;');
+      Add('');
+      Add('  .dynamic        : { *(.dynamic) }');
+      Add('  .data           : {');
+      Add('    PROVIDE(_DATA_BASE_ = .);');
+      Add('    *(.data .data.* .gnu.linkonce.d.*)');
+      Add('    VBCC_CONSTRUCTORS_ELF');
+      Add('  }');
+      Add('  .ctors          : { *(.ctors .ctors.*) }');
+      Add('  .dtors          : { *(.dtors .dtors.*) }');
+      Add('  .data68k        : { *(DATA data) }');
+      Add('  .got            : { *(.got.plt) *(.got) }');
+      Add('  .sdata          : {');
+      Add('    PROVIDE(_SDATA_BASE_ = .);');
+      Add('    _LinkerDB = . + 0x8000;');
+      Add('    _SDA_BASE_ = . + 0x8000;');
+      Add('    *(.sdata .sdata.* .tocd .gnu.linkonce.s.*)');
+      Add('  }');
+      Add('  .sdata68k       : { *(__MERGED) }');
+      Add('');
+      Add('  /*');
+      Add('  PROVIDE(_edata = .);');
+      Add('  PROVIDE(edata = .);');
+      Add('  PROVIDE(__bss_start = .);');
+      Add('  */');
+      Add('');
+      Add('  .sbss           : {');
+      Add('    PROVIDE(__sbss_start = .);');
+      Add('    PROVIDE(___sbss_start = .);');
+      Add('    *(.sbss .sbss.* .gnu.linkonce.sb.*)');
+      Add('    *(.scommon)');
+      Add('    PROVIDE(__sbss_end = .);');
+      Add('    PROVIDE(___sbss_end = .);');
+      Add('  }');
+      Add('  .plt            : { *(.plt) }');
+      Add('  .bss            : {');
+      Add('    *(.bss .bss.* .gnu.linkonce.b.*)');
+      Add('    *(COMMON)');
+      Add('  }');
+      Add('  .bss68k         : { *(BSS bss) }');
+      Add('');
+      Add('  . = ALIGN(16);');
+      Add('  PROVIDE(_end = .);');
+      Add('  PROVIDE(end = .);');
+      Add('');
+      Add('  .comment      0 : { *(.comment) }');
+      Add('');
+      Add('  __amigaos4__ = 1;');
+      Add('');
+      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('  /* DWARF 2.1 */');
+      Add('  .debug_ranges   0 : { *(.debug_ranges) }');
+      Add('}');
+     end;
+   end;
+
 { Write and Close response }
   linkres.writetodisk;
   linkres.free;