[fpc-pascal] Using arm-embedded-fpc

Koenraad Lelong fpascal1 at de-brouwerij.be
Wed Oct 23 17:58:08 CEST 2013


op 23-10-13 13:54, Jonas Maebe schreef:
>
> On 23 Oct 2013, at 12:05, Koenraad Lelong wrote:
>
>> fpc at linux:~/src-arm-fpc> fpc -Parm -Tembedded -Wplpc2124 -sh tled1.pp
>> Free Pascal Compiler version 2.7.1 [2013/10/23] for arm
>> Copyright (c) 1993-2013 by Florian Klaempfl and others
>> Target OS: Embedded
>> Compiling tled1.pp
>> tled1.pp(54,4) Fatal: Can't open executable tled1.elf
>> Fatal: Compilation aborted
>> Error: /usr/bin/ppcrossarm returned an error exitcode (normal if you
>> did not specify a source file to be compiled)
>
> Can you try again after applying the attached patch?
>
>
> Jonas
>
Thanks Jonas,

Now I can use -sh. The resulting ppas.sh :

#!/bin/sh
DoExitAsm ()
{ echo "An error occurred while assembling $1"; exit 1; }
DoExitLink ()
{ echo "An error occurred while linking $1"; exit 1; }
echo Assembling program
/usr/bin/arm-embedded-as -mfpu=softvfp -o tled1.o tled1.s
if [ $? != 0 ]; then DoExitAsm program; fi
rm tled1.s
echo Linking tled1
OFS=$IFS
IFS="
"
/usr/bin/arm-embedded-ld -g  --build-id   --gc-sections  -L. -o 
tled1.elf -T link.res
if [ $? != 0 ]; then DoExitLink tled1; fi
IFS=$OFS
echo Linking tled1
OFS=$IFS
IFS="
"
/usr/bin/arm-embedded-objcopy -O ihex tled1.elf tled1.hex
if [ $? != 0 ]; then DoExitLink tled1; fi
IFS=$OFS

Tinkering with it I found --build-id gives my problem. If that is 
removed, there are no errors.
But I also analyzed link.res :
SEARCH_DIR("/usr/lib/fpc/2.7.1/units/arm-embedded/rtl/")
SEARCH_DIR("/usr/lib/fpc/2.7.1/")
INPUT (
tled1.o
/usr/lib/fpc/2.7.1/units/arm-embedded/rtl/system.o
/usr/lib/fpc/2.7.1/units/arm-embedded/rtl/lpc21x4.o
)
ENTRY(_START)
MEMORY
{
     flash : ORIGIN = 0x00000000, LENGTH = 0x00040000
     ram : ORIGIN = 0x40000000, LENGTH = 0x00004000
}
_stack_top = 0x40004000;
SECTIONS
{
      .text :
     {
     _text_start = .;
     KEEP(*(.init, .init.*))
     *(.text, .text.*)
     *(.strings)
     *(.rodata, .rodata.*)
     *(.comment)
     _etext = .;
     } >flash
     .note.gnu.build-id : { *(.note.gnu.build-id) }
     .data :
     {
     _data = .;
     *(.data, .data.*)
     KEEP (*(.fpc .fpc.n_version .fpc.n_links))
     _edata = .;
     } >ram AT >flash
     .bss :
     {
     _bss_start = .;
     *(.bss, .bss.*)
     *(COMMON)
     } >ram
. = ALIGN(4);
_bss_end = . ;
}
_end = .;


Deducing from the error-message :
/usr/bin/arm-embedded-ld: error: no memory region specified for loadable 
section `.note.gnu.build-id'

in ppas.sh I modified the line
     .note.gnu.build-id : { *(.note.gnu.build-id) }
to
     .note.gnu.build-id : { *(.note.gnu.build-id) } >flash

Then ppas.sh reports no errors.

I modified compiler/systems/t_embed.pas to have that line, and then the 
compilation of tled1 without -sh produces a tled1.elf. And the 
disassembled tled1.elf seems to be the program when comparing with a 
saved tled1.s.

So, is it safe to include that '>flash' to the linking script via the 
compiler ? Did I find a bug, or am I doing something wrong ?

Thanks for your support.

Koenraad




More information about the fpc-pascal mailing list