Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2007-11

ppcrossarm 220

4 messages · 2 people ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Carsten Bager

I have built a Win32 ppcrossarm.exe (2.20) compiler. The compiler works ok. The output from the Linux and the Win32 compiler when I use the -sh directive is exactly the same. The downside is I have some problems finding a Win32 linker that I can use.

If I compile a Hallow World program, it works ok, but when I try to compile a program that uses uLibc, the Win32 linker and the Linux linker dos not do exactly the same.

When I run the output from the Win32 linker on my arm platform it stops with
Segmentation fault
The output from the Linux linker runs ok

If I look in the map file the only difference I can see is (see at the end of this mail)

Linux: 0x000080d4 . = (0x8000 + SIZEOF_HEADERS) Win32: 0x00008000 . = 0x8000

I have several versions of Win32 linkers (215,216,217) and Linux linkers (215,216,217,218). I have also seen this problem with a Linux linker (217)

One of the Win32 linkers I have used if from
ftp://ftp.freepascal.org/pub/fpc/contrib/cross/mingw/binutils-2.15.94-win32- arm-linux.zip

Has anyone got a hint where to go from here.

Regards

Carsten

---------------------- Linux --------------------------------------------- 0x00010000 PROVIDE (__executable_start, 0x10000) 0x00010100 . = 0x10100
0x00008000 PROVIDE (__executable_start, 0x8000) 0x000080d4 . = (0x8000 + SIZEOF_HEADERS)

.interp 0x000080d4 0x13
*(.interp)
.interp 0x000080d4 0x13 /Fpc/Lib/Ulibc/Arm/cprt0.o *(.interp)

.hash 0x000080e8 0x94
*(.hash)
.hash 0x000080e8 0x94 /Fpc/Lib/Ulibc/Arm/cprt0.o *(.hash)

.dynsym 0x0000817c 0x120
*(.dynsym)
.dynsym 0x0000817c 0x120 /Fpc/Lib/Ulibc/Arm/cprt0.o *(.dynsym)

.dynstr 0x0000829c 0xc4
*(.dynstr)
.dynstr 0x0000829c 0xc4 /Fpc/Lib/Ulibc/Arm/cprt0.o *(.dynstr)

.gnu.version
*(.gnu.version)
*(.gnu.version)

.gnu.version_d
*(.gnu.version_d)
*(.gnu.version_d)

.gnu.version_r
*(.gnu.version_r)
*(.gnu.version_r)

.rel.dyn 0x00008360 0x18
*(.rel.init)
*(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
*(.rel.fini)
*(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) *(.rel.data.rel.ro*)
*(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
*(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
*(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
*(.rel.ctors)
*(.rel.dtors)
*(.rel.got)
.rel.got 0x00008360 0x18 /Fpc/Lib/Ulibc/Arm/cprt0.o *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
*(.rel.init)
*(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)

---------------------- Win32 -------------------------------------------------- 0x00010000 PROVIDE (__executable_start, 0x10000) 0x00010100 . = 0x10100
0x00008000 PROVIDE (__executable_start, 0x8000) 0x00008000 . = 0x8000

.interp 0x00008000 0x13
*(.interp)
.interp 0x00008000 0x13 J:\Fpc\Lib\Ulibc\Arm\cprt0.o *(.interp)

.hash 0x00008014 0x90
*(.hash)
.hash 0x00008014 0x90 J:\Fpc\Lib\Ulibc\Arm\cprt0.o *(.hash)

.dynsym 0x000080a4 0x110
*(.dynsym)
.dynsym 0x000080a4 0x110 J:\Fpc\Lib\Ulibc\Arm\cprt0.o *(.dynsym)

.dynstr 0x000081b4 0xbb
*(.dynstr)
.dynstr 0x000081b4 0xbb J:\Fpc\Lib\Ulibc\Arm\cprt0.o *(.dynstr)

.gnu.version 0x00008270 0x0
*(.gnu.version)
*(.gnu.version)

.gnu.version_d 0x00008270 0x0
*(.gnu.version_d)
*(.gnu.version_d)

.gnu.version_r 0x00008270 0x0
*(.gnu.version_r)
*(.gnu.version_r)

.rel.dyn 0x00008270 0x18
*(.rel.init)
*(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
*(.rel.fini)
*(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*)
*(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
*(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
*(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
*(.rel.ctors)
*(.rel.dtors)
*(.rel.got)
.rel.got 0x00008270 0x18 J:\Fpc\Lib\Ulibc\Arm\cprt0.o *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
*(.rel.init)
*(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)

Reply by email

Florian Klaempfl
to Carsten Bager
Show quoted text 12 lines
I have built a Win32 ppcrossarm.exe (2.20) compiler. The compiler works ok. The output from the Linux and the Win32 compiler when I use the -sh directive is exactly the same. The downside is I have some problems finding a Win32 linker that I can use. If I compile a Hallow World program, it works ok, but when I try to compile a program that uses uLibc, the Win32 linker and the Linux linker dos not do exactly the same. When I run the output from the Win32 linker on my arm platform it stops with Segmentation fault

Did you load it in GDB? Where does it exactly crash?

Show quoted text 13 lines
The output from the Linux linker runs ok If I look in the map file the only difference I can see is (see at the end of this mail) Linux: 0x000080d4 . = (0x8000 + SIZEOF_HEADERS) Win32: 0x00008000 . = 0x8000 I have several versions of Win32 linkers (215,216,217) and Linux linkers (215,216,217,218). I have also seen this problem with a Linux linker (217) One of the Win32 linkers I have used if from ftp://ftp.freepascal.org/pub/fpc/contrib/cross/mingw/binutils-2.15.94-win32- arm-linux.zip

I guess it is linker script related. Unfortunatly FPC comes with an integrated linker script however it seems there is no generic one.

Try to compare the various linker scripts to narrow it down. From ld you get it with
ld --verbose

From FPC you get it when compiling with -s:

it's the SECTIONS { ... }part of the resulting link.res

Reply by email

Carsten Bager
to Florian Klaempfl
Show quoted text 8 lines
I guess it is linker script related. Unfortunatly FPC comes with an integrated linker script however it seems there is no generic one. Try to compare the various linker scripts to narrow it down. From ld you get it with ld --verbose From FPC you get it when compiling with -s: it's the SECTIONS { ... }part of the resulting link.res

The scripts (.res files) produced by the Linux compiler and the win32 compiler are 100% the same.

The output form the 2 linkers are deferent but what it means ?? Again the first thing that is different is the line

Linux   PROVIDE (__executable_start = 0x00008000); . =0x00008000+SIZEOF_HEADERS;
Win32 PROVIDE (__executable_start = 0x8000); . = 0x8000;

My conclusion is, the problem is the win32 linker, but is there a way I can get it to behave like the Linux linker.

Regards
Carsten

----------------------------------- The Win32 Linker ---------------------------------------

GNU ld version 2.16.91 20060320
Supported emulations:
armelf
using internal linker script:
================================================== /* Script for -z combreloc: combine and sort reloc sections */ OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm",
"elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SEARCH_DIR("/c/gcc-build/install/arm-unknown-elf/lib"); SECTIONS
{
/* Read-only sections, merged into text segment: */

  PROVIDE (__executable_start = 0x8000); . = 0x8000;
  .interp         : { *(.interp) }
  .hash           : { *(.hash) }
  .dynsym         : { *(.dynsym) }
  .dynstr         : { *(.dynstr) }
  .gnu.version    : { *(.gnu.version) }
  .gnu.version_d  : { *(.gnu.version_d) }
  .gnu.version_r  : { *(.gnu.version_r) }
  .rel.dyn        :
    {
      *(.rel.init)
      *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
      *(.rel.fini)
      *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
      *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*)
      *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
      *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
      *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
      *(.rel.ctors)
      *(.rel.dtors)
      *(.rel.got)
      *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
    }
  .rela.dyn       :
    {
      *(.rela.init)
      *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
      *(.rela.fini)
      *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
      *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
      *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
      *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
      *(.rela.ctors)
      *(.rela.dtors)
      *(.rela.got)
      *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
    }
  .rel.plt        : { *(.rel.plt) }
  .rela.plt       : { *(.rela.plt) }
  .init           :
  {
    KEEP (*(.init))
  } =0
  .plt            : { *(.plt) }
  .text           :
  {
    *(.text .stub .text.* .gnu.linkonce.t.*)
    KEEP (*(.text.*personality*))
    /* .gnu.warning sections are handled specially by elf32.em.  */
    *(.gnu.warning)
    *(.glue_7t) *(.glue_7)
  } =0
  .fini           :
  {
    KEEP (*(.fini))
  } =0
  PROVIDE (__etext = .);
  PROVIDE (_etext = .);
  PROVIDE (etext = .);
  .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
  .rodata1        : { *(.rodata1) }
  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) }
   __exidx_start = .;
  .ARM.exidx   : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) }
   __exidx_end = .;
  .eh_frame_hdr : { *(.eh_frame_hdr) }
  .eh_frame       : ONLY_IF_RO { KEEP (*(.eh_frame)) }
  .gcc_except_table   : ONLY_IF_RO { *(.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.  */
  . = ALIGN(256) + (. & (256 - 1));
  /* Exception handling  */
  .eh_frame       : ONLY_IF_RW { KEEP (*(.eh_frame)) }
  .gcc_except_table   : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }
  /* Thread Local Storage sections  */
  .tdata	  : { *(.tdata .tdata.* .gnu.linkonce.td.*) }
  .tbss		  : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
  .preinit_array     :
  {
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array))
    PROVIDE_HIDDEN (__preinit_array_end = .);
  }
  .init_array     :
  {
     PROVIDE_HIDDEN (__init_array_start = .);
     KEEP (*(SORT(.init_array.*)))
     KEEP (*(.init_array))
     PROVIDE_HIDDEN (__init_array_end = .);
  }
  .fini_array     :
  {
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(.fini_array))
    KEEP (*(SORT(.fini_array.*)))
    PROVIDE_HIDDEN (__fini_array_end = .);
  }
  .ctors          :
  {
    /* gcc uses crtbegin.o to find the start of
       the constructors, so we make sure it is
       first.  Because this is a wildcard, it
       doesn't matter if the user does not
       actually link against crtbegin.o; the
       linker won't look for a file to match a
       wildcard.  The wildcard also means that it
       doesn't matter which directory crtbegin.o
       is in.  */
    KEEP (*crtbegin*.o(.ctors))
    /* We don't want to include the .ctor section from
       the crtend.o file until after the sorted ctors.
       The .ctor section from the crtend file contains the
       end of ctors marker and it must be last */
    KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors))
    KEEP (*(SORT(.ctors.*)))
    KEEP (*(.ctors))
  }
  .dtors          :
  {
    KEEP (*crtbegin*.o(.dtors))
    KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors))
    KEEP (*(SORT(.dtors.*)))
    KEEP (*(.dtors))
  }
  .jcr            : { KEEP (*(.jcr)) }
  .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro*

.gnu.linkonce.d.rel.ro.*) }
.dynamic : { *(.dynamic) }
.got : { *(.got.plt) *(.got) }
.data :
{

    __data_start = . ;
    *(.data .data.* .gnu.linkonce.d.*)
    KEEP (*(.gnu.linkonce.d.*personality*))
    SORT(CONSTRUCTORS)
  }
  .data1          : { *(.data1) }
  _edata = .; PROVIDE (edata = .);
  __bss_start = .;
  __bss_start__ = .;
  .bss            :
  {
   *(.dynbss)
   *(.bss .bss.* .gnu.linkonce.b.*)
   *(COMMON)
   /* Align here to ensure that the .bss section occupies space up to
      _end.  Align after .bss to ensure correct alignment even if the
      .bss section disappears because there are no input sections.
      FIXME: Why do we need it? When there is no .bss section, we don't
      pad the .data section.  */
   . = ALIGN(. != 0 ? 32 / 8 : 1);
  }
  _bss_end__ = . ; __bss_end__ = . ;
  . = ALIGN(32 / 8);
  . = ALIGN(32 / 8);
  __end__ = . ;
  _end = .; PROVIDE (end = .);
  /* Stabs debugging sections.  */
  .stab          0 : { *(.stab) }
  .stabstr       0 : { *(.stabstr) }
  .stab.excl     0 : { *(.stab.excl) }
  .stab.exclstr  0 : { *(.stab.exclstr) }
  .stab.index    0 : { *(.stab.index) }
  .stab.indexstr 0 : { *(.stab.indexstr) }
  .comment       0 : { *(.comment) }
  /* DWARF debug sections.
     Symbols in the DWARF debugging sections are relative to the beginning
     of the section so we begin them at 0.  */
  /* DWARF 1 */
  .debug          0 : { *(.debug) }
  .line           0 : { *(.line) }
  /* GNU DWARF 1 extensions */
  .debug_srcinfo  0 : { *(.debug_srcinfo) }
  .debug_sfnames  0 : { *(.debug_sfnames) }
  /* DWARF 1.1 and DWARF 2 */
  .debug_aranges  0 : { *(.debug_aranges) }
  .debug_pubnames 0 : { *(.debug_pubnames) }
  /* DWARF 2 */
  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
  .debug_abbrev   0 : { *(.debug_abbrev) }
  .debug_line     0 : { *(.debug_line) }
  .debug_frame    0 : { *(.debug_frame) }
  .debug_str      0 : { *(.debug_str) }
  .debug_loc      0 : { *(.debug_loc) }
  .debug_macinfo  0 : { *(.debug_macinfo) }
  /* SGI/MIPS DWARF 2 extensions */
  .debug_weaknames 0 : { *(.debug_weaknames) }
  .debug_funcnames 0 : { *(.debug_funcnames) }
  .debug_typenames 0 : { *(.debug_typenames) }
  .debug_varnames  0 : { *(.debug_varnames) }
    .stack         0x80000 :
  {
    _stack = .;
    *(.stack)
  }
  .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }
  .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) }
  /DISCARD/ : { *(.note.GNU-stack) }

}

================================================== attempt to open link.res succeeded
opened script file link.res
attempt to open J:\Fpc\Lib\Ulibc\Arm\cprt0.o succeeded J:\Fpc\Lib\Ulibc\Arm\cprt0.o
attempt to open hw.o succeeded
-
-
-

----------------------------------- The Linux Linker ----------------------------------------------- GNU ld version 2.16.1
Supported emulations:
armelf_linux
armelf
using internal linker script:
================================================== /* Script for -z combreloc: combine and sort reloc sections */ OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm",
"elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SEARCH_DIR("/root/arm-linux-gcc//arm-linux-uclibc/lib"); /* Do we need any of these for elf?
__DYNAMIC = 0; */
SECTIONS
{
/* Read-only sections, merged into text segment: */

  PROVIDE (__executable_start = 0x00008000); . = 0x00008000 + SIZEOF_HEADERS;
  .interp         : { *(.interp) }
  .hash           : { *(.hash) }
  .dynsym         : { *(.dynsym) }
  .dynstr         : { *(.dynstr) }
  .gnu.version    : { *(.gnu.version) }
  .gnu.version_d  : { *(.gnu.version_d) }
  .gnu.version_r  : { *(.gnu.version_r) }
  .rel.dyn        :
    {
      *(.rel.init)
      *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
      *(.rel.fini)
      *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
      *(.rel.data.rel.ro*)
      *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
      *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
      *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
      *(.rel.ctors)
      *(.rel.dtors)
      *(.rel.got)
      *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
    }
  .rela.dyn       :
    {
      *(.rela.init)
      *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
      *(.rela.fini)
      *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
      *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
      *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
      *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
      *(.rela.ctors)
      *(.rela.dtors)
      *(.rela.got)
      *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
    }
  .rel.plt        : { *(.rel.plt) }
  .rela.plt       : { *(.rela.plt) }
  .init           :
  {
    KEEP (*(.init))
  } =0
  .plt            : { *(.plt) }
  .text           :
  {
    *(.text .stub .text.* .gnu.linkonce.t.*)
    KEEP (*(.text.*personality*))
    /* .gnu.warning sections are handled specially by elf32.em.  */
    *(.gnu.warning)
    *(.glue_7t) *(.glue_7)
  } =0
  .fini           :
  {
    KEEP (*(.fini))
  } =0
  PROVIDE (__etext = .);
  PROVIDE (_etext = .);
  PROVIDE (etext = .);
  .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
  .rodata1        : { *(.rodata1) }
  .eh_frame_hdr : { *(.eh_frame_hdr) }
  .eh_frame       : ONLY_IF_RO { KEEP (*(.eh_frame)) }
  .gcc_except_table   : ONLY_IF_RO { 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.  */
  . = ALIGN (0x8000) - ((0x8000 - .) & (0x8000 - 1)); . = DATA_SEGMENT_ALIGN (0x8000,

0x1000);
/* Exception handling */
.eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } .gcc_except_table : ONLY_IF_RW { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } /* Thread Local Storage sections */
.tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } /* Ensure the __preinit_array_start label is properly aligned. We could instead move the label definition inside the section, but the linker would then create the section even if it turns out to be empty, which isn't pretty. */

  . = ALIGN(32 / 8);
  PROVIDE (__preinit_array_start = .);
  .preinit_array     : { KEEP (*(.preinit_array)) }
  PROVIDE (__preinit_array_end = .);
  PROVIDE (__init_array_start = .);
  .init_array     : { KEEP (*(.init_array)) }
  PROVIDE (__init_array_end = .);
  PROVIDE (__fini_array_start = .);
  .fini_array     : { KEEP (*(.fini_array)) }
  PROVIDE (__fini_array_end = .);
  .ctors          :
  {
    /* gcc uses crtbegin.o to find the start of
       the constructors, so we make sure it is
       first.  Because this is a wildcard, it
       doesn't matter if the user does not
       actually link against crtbegin.o; the
       linker won't look for a file to match a
       wildcard.  The wildcard also means that it
       doesn't matter which directory crtbegin.o
       is in.  */
    KEEP (*crtbegin*.o(.ctors))
    /* We don't want to include the .ctor section from
       from the crtend.o file until after the sorted ctors.
       The .ctor section from the crtend file contains the
       end of ctors marker and it must be last */
    KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors))
    KEEP (*(SORT(.ctors.*)))
    KEEP (*(.ctors))
  }
  .dtors          :
  {
    KEEP (*crtbegin*.o(.dtors))
    KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors))
    KEEP (*(SORT(.dtors.*)))
    KEEP (*(.dtors))
  }
  .jcr            : { KEEP (*(.jcr)) }
  .data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro*) }
  .dynamic        : { *(.dynamic) }
  . = DATA_SEGMENT_RELRO_END (0, .);
  .got            : { *(.got.plt) *(.got) }
  .data           :
  {
    __data_start = . ;
    *(.data .data.* .gnu.linkonce.d.*)
    KEEP (*(.gnu.linkonce.d.*personality*))
    SORT(CONSTRUCTORS)
  }
  .data1          : { *(.data1) }
  _edata = .;
  PROVIDE (edata = .);
  __bss_start = .;
  __bss_start__ = .;
  .bss            :
  {
   *(.dynbss)
   *(.bss .bss.* .gnu.linkonce.b.*)
   *(COMMON)
   /* Align here to ensure that the .bss section occupies space up to
      _end.  Align after .bss to ensure correct alignment even if the
      .bss section disappears because there are no input sections.  */
   . = ALIGN(32 / 8);
  }
  . = ALIGN(32 / 8);
  _end = .;
  _bss_end__ = . ; __bss_end__ = . ; __end__ = . ;
  PROVIDE (end = .);
  . = DATA_SEGMENT_END (.);
  /* Stabs debugging sections.  */
  .stab          0 : { *(.stab) }
  .stabstr       0 : { *(.stabstr) }
  .stab.excl     0 : { *(.stab.excl) }
  .stab.exclstr  0 : { *(.stab.exclstr) }
  .stab.index    0 : { *(.stab.index) }
  .stab.indexstr 0 : { *(.stab.indexstr) }
  .comment       0 : { *(.comment) }
  /* DWARF debug sections.
     Symbols in the DWARF debugging sections are relative to the beginning
     of the section so we begin them at 0.  */
  /* DWARF 1 */
  .debug          0 : { *(.debug) }
  .line           0 : { *(.line) }
  /* GNU DWARF 1 extensions */
  .debug_srcinfo  0 : { *(.debug_srcinfo) }
  .debug_sfnames  0 : { *(.debug_sfnames) }
  /* DWARF 1.1 and DWARF 2 */
  .debug_aranges  0 : { *(.debug_aranges) }
  .debug_pubnames 0 : { *(.debug_pubnames) }
  /* DWARF 2 */
  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
  .debug_abbrev   0 : { *(.debug_abbrev) }
  .debug_line     0 : { *(.debug_line) }
  .debug_frame    0 : { *(.debug_frame) }
  .debug_str      0 : { *(.debug_str) }
  .debug_loc      0 : { *(.debug_loc) }
  .debug_macinfo  0 : { *(.debug_macinfo) }
  /* SGI/MIPS DWARF 2 extensions */
  .debug_weaknames 0 : { *(.debug_weaknames) }
  .debug_funcnames 0 : { *(.debug_funcnames) }
  .debug_typenames 0 : { *(.debug_typenames) }
  .debug_varnames  0 : { *(.debug_varnames) }
  .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }
  /DISCARD/ : { *(.note.GNU-stack) }

}

================================================== attempt to open link.res succeeded
opened script file link.res
attempt to open /Fpc/Lib/Ulibc/Arm/cprt0.o succeeded /Fpc/Lib/Ulibc/Arm/cprt0.o
attempt to open hw.o succeeded

-
-
-

Reply by email

Florian Klaempfl
to Carsten Bager: I have built a Win32 ppcrossarm.exe (2.20) compiler. The compiler works ok. The output…
Show quoted text 27 lines
I have built a Win32 ppcrossarm.exe (2.20) compiler. The compiler works ok. The output from the Linux and the Win32 compiler when I use the -sh directive is exactly the same. The downside is I have some problems finding a Win32 linker that I can use. If I compile a Hallow World program, it works ok, but when I try to compile a program that uses uLibc, the Win32 linker and the Linux linker dos not do exactly the same. When I run the output from the Win32 linker on my arm platform it stops with Segmentation fault The output from the Linux linker runs ok If I look in the map file the only difference I can see is (see at the end of this mail) Linux: 0x000080d4 . = (0x8000 + SIZEOF_HEADERS) Win32: 0x00008000 . = 0x8000 I have several versions of Win32 linkers (215,216,217) and Linux linkers (215,216,217,218). I have also seen this problem with a Linux linker (217) One of the Win32 linkers I have used if from ftp://ftp.freepascal.org/pub/fpc/contrib/cross/mingw/binutils-2.15.94-win32- arm-linux.zip Has anyone got a hint where to go from here.

- try to compare FPC's linker script with one of a working ld
- try to find differences using objdump

Show quoted text 127 lines
Regards Carsten ---------------------- Linux --------------------------------------------- 0x00010000 PROVIDE (__executable_start, 0x10000) 0x00010100 . = 0x10100 0x00008000 PROVIDE (__executable_start, 0x8000) 0x000080d4 . = (0x8000 + SIZEOF_HEADERS) .interp 0x000080d4 0x13 *(.interp) .interp 0x000080d4 0x13 /Fpc/Lib/Ulibc/Arm/cprt0.o *(.interp) .hash 0x000080e8 0x94 *(.hash) .hash 0x000080e8 0x94 /Fpc/Lib/Ulibc/Arm/cprt0.o *(.hash) .dynsym 0x0000817c 0x120 *(.dynsym) .dynsym 0x0000817c 0x120 /Fpc/Lib/Ulibc/Arm/cprt0.o *(.dynsym) .dynstr 0x0000829c 0xc4 *(.dynstr) .dynstr 0x0000829c 0xc4 /Fpc/Lib/Ulibc/Arm/cprt0.o *(.dynstr) .gnu.version *(.gnu.version) *(.gnu.version) .gnu.version_d *(.gnu.version_d) *(.gnu.version_d) .gnu.version_r *(.gnu.version_r) *(.gnu.version_r) .rel.dyn 0x00008360 0x18 *(.rel.init) *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) *(.rel.fini) *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) *(.rel.data.rel.ro*) *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) *(.rel.ctors) *(.rel.dtors) *(.rel.got) .rel.got 0x00008360 0x18 /Fpc/Lib/Ulibc/Arm/cprt0.o *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) *(.rel.init) *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) ---------------------- Win32 -------------------------------------------------- 0x00010000 PROVIDE (__executable_start, 0x10000) 0x00010100 . = 0x10100 0x00008000 PROVIDE (__executable_start, 0x8000) 0x00008000 . = 0x8000 .interp 0x00008000 0x13 *(.interp) .interp 0x00008000 0x13 J:\Fpc\Lib\Ulibc\Arm\cprt0.o *(.interp) .hash 0x00008014 0x90 *(.hash) .hash 0x00008014 0x90 J:\Fpc\Lib\Ulibc\Arm\cprt0.o *(.hash) .dynsym 0x000080a4 0x110 *(.dynsym) .dynsym 0x000080a4 0x110 J:\Fpc\Lib\Ulibc\Arm\cprt0.o *(.dynsym) .dynstr 0x000081b4 0xbb *(.dynstr) .dynstr 0x000081b4 0xbb J:\Fpc\Lib\Ulibc\Arm\cprt0.o *(.dynstr) .gnu.version 0x00008270 0x0 *(.gnu.version) *(.gnu.version) .gnu.version_d 0x00008270 0x0 *(.gnu.version_d) *(.gnu.version_d) .gnu.version_r 0x00008270 0x0 *(.gnu.version_r) *(.gnu.version_r) .rel.dyn 0x00008270 0x18 *(.rel.init) *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) *(.rel.fini) *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) *(.rel.ctors) *(.rel.dtors) *(.rel.got) .rel.got 0x00008270 0x18 J:\Fpc\Lib\Ulibc\Arm\cprt0.o *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) *(.rel.init) *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) _______________________________________________ fpc-pascal maillist - http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply by email