Browse Source

* update generic linker script

git-svn-id: trunk@43426 -
florian 5 years ago
parent
commit
f20e6ff323
1 changed files with 64 additions and 9 deletions
  1. 64 9
      compiler/systems/t_linux.pas

+ 64 - 9
compiler/systems/t_linux.pas

@@ -1320,21 +1320,76 @@ begin
             add('    KEEP (*(.fini))');
             add('    KEEP (*(.fini))');
             add('  } =0x90909090');
             add('  } =0x90909090');
             add('  PROVIDE (_etext = .);');
             add('  PROVIDE (_etext = .);');
-            add('  .rodata         :');
-            add('  {');
-            add('    *(.rodata .rodata.* .gnu.linkonce.r.*)');
-            add('  }');
+            add('  .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }');
             add('  .rodata1        : { *(.rodata1) }');
             add('  .rodata1        : { *(.rodata1) }');
             add('  .eh_frame_hdr : { *(.eh_frame_hdr) }');
             add('  .eh_frame_hdr : { *(.eh_frame_hdr) }');
             add('  .eh_frame       : ONLY_IF_RO { KEEP (*(.eh_frame)) }');
             add('  .eh_frame       : ONLY_IF_RO { KEEP (*(.eh_frame)) }');
-            add('  .gcc_except_table   : { KEEP (*(.gcc_except_table .gcc_except_table.*)) }');
-
-            {Adjust the address for the data segment.  We want to adjust up to
-             the same address within the page on the next page up.}
-            add('  . = ALIGN (0x1000) - ((0x1000 - .) & (0x1000 - 1));');
+            add('  .gcc_except_table   : ONLY_IF_RO { *(.gcc_except_table');
+            add('  .gcc_except_table.*) }');
+            add('  /* These sections are generated by the Sun/Oracle C++ compiler.  */');
+            add('  .exception_ranges   : ONLY_IF_RO { *(.exception_ranges');
+            add('  .exception_ranges*) }');
+            add('  /* Adjust the address for the data segment.  We want to adjust up to');
+            add('     the same address within the page on the next page up.  */');
+            add('  . = ALIGN (CONSTANT (MAXPAGESIZE)) - ((CONSTANT (MAXPAGESIZE) - .) & (CONSTANT (MAXPAGESIZE) - 1)); . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE));');
             add('  /* Exception handling  */');
             add('  /* Exception handling  */');
             add('  .eh_frame       : ONLY_IF_RW { KEEP (*(.eh_frame)) }');
             add('  .eh_frame       : ONLY_IF_RW { KEEP (*(.eh_frame)) }');
             add('  .gcc_except_table   : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }');
             add('  .gcc_except_table   : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }');
+            add('  .exception_ranges   : ONLY_IF_RW { *(.exception_ranges .exception_ranges*) }');
+            add('  /* Thread Local Storage sections  */');
+            add('  .tdata          : { *(.tdata .tdata.* .gnu.linkonce.td.*) }');
+            add('  .tbss           : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }');
+            add('  .preinit_array     :');
+            add('  {');
+            add('    PROVIDE_HIDDEN (__preinit_array_start = .);');
+            add('    KEEP (*(.preinit_array))');
+            add('    PROVIDE_HIDDEN (__preinit_array_end = .);');
+            add('  }');
+            add('  .init_array     :');
+            add('  {');
+            add('    PROVIDE_HIDDEN (__init_array_start = .);');
+            add('    KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))');
+            add('    KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))');
+            add('    PROVIDE_HIDDEN (__init_array_end = .);');
+            add('  }');
+            add('  .fini_array     :');
+            add('  {');
+            add('    PROVIDE_HIDDEN (__fini_array_start = .);');
+            add('    KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))');
+            add('    KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))');
+            add('    PROVIDE_HIDDEN (__fini_array_end = .);');
+            add('  }');
+            add('  .ctors          :');
+            add('  {');
+            add('    /* gcc uses crtbegin.o to find the start of');
+            add('       the constructors, so we make sure it is');
+            add('       first.  Because this is a wildcard, it');
+            add('       doesn''t matter if the user does not');
+            add('       actually link against crtbegin.o; the');
+            add('       linker won''t look for a file to match a');
+            add('       wildcard.  The wildcard also means that it');
+            add('       doesn''t matter which directory crtbegin.o');
+            add('       is in.  */');
+            add('    KEEP (*crtbegin.o(.ctors))');
+            add('    KEEP (*crtbegin?.o(.ctors))');
+            add('    /* We don''t want to include the .ctor section from');
+            add('       the crtend.o file until after the sorted ctors.');
+            add('       The .ctor section from the crtend file contains the');
+            add('       end of ctors marker and it must be last */');
+            add('    KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))');
+            add('    KEEP (*(SORT(.ctors.*)))');
+            add('    KEEP (*(.ctors))');
+            add('  }');
+            add('  .dtors          :');
+            add('  {');
+            add('    KEEP (*crtbegin.o(.dtors))');
+            add('    KEEP (*crtbegin?.o(.dtors))');
+            add('    KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))');
+            add('    KEEP (*(SORT(.dtors.*)))');
+            add('    KEEP (*(.dtors))');
+            add('  }');
+            add('  .jcr            : { KEEP (*(.jcr)) }');
+            add('  .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }');
             add('  .dynamic        : { *(.dynamic) }');
             add('  .dynamic        : { *(.dynamic) }');
             add('  .got            : { *(.got) }');
             add('  .got            : { *(.got) }');
             add('  .got.plt        : { *(.got.plt) }');
             add('  .got.plt        : { *(.got.plt) }');