ppcrossarm 220

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

ppcrossarm 220

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.*)






_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: ppcrossarm 220

Florian Klämpfl
Carsten Bager schrieb:

> 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?

> 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
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: ppcrossarm 220

Carsten Bager
> 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

-
-
-




_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: ppcrossarm 220

Florian Klämpfl
In reply to this post by Carsten Bager
Carsten Bager schrieb:

> 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

>
> 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  -  [hidden email]
> http://lists.freepascal.org/mailman/listinfo/fpc-pascal
>

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal