[fpc-devel] Install fpc and Friends on a non-Debian ARM-Linux Device

Michael Schnell mschnell at lumino.de
Mon Jan 21 11:26:13 CET 2013


Hi experts. (Beware: long explanation trying to help those ho try 
something similar. A question is asked at the end.)

I am trying to install, test and run fpc programs on a QNAP 219 P II NAS.

Same is a headless ARM-Linux device. With 512 MB RAM and It has enough 
resources to even run Lazarus in a remote GUI environment.

But first I tried to install and use fpc.

Here the initial problem is, that the device uses a mildly QNAP 
propriety Linux distribution. Same comes with installation tools for 
it's own package format (".qpkg") moreover you can install Optware 
".ipkg" packages, as there is a qpkg for Optware. .

But for fpc there is neither a qpkg not an ipkg package. AFAIK for ARM 
there only is an Debian "apt-get" package for fpc and friends. Same is 
said to happily be useable on a "Raspberry Pi" with similar resources as 
the QNAP 219 P II.

So I tried to find the appropriate ".deb" files

I found the downloadable Debian package here:

http://packages.debian.org/squeeze/armel/fp-compiler/download -> 
http://ftp.de.debian.org/debian/pool/main/f/fpc/fp-compiler_2.4.0-2_armel.deb

I could extract the content doing

 >  ar x fp-compiler_2.4.0-2_armel.deb

Now I have a set of some file including data.tar.bz2 and control.tar.gz

Using Midnight Commander (installed as an ipkg) I extracted those to 
appropriately named the directories.

"control" contains files to be used by apt

"data" contains the folders "etc" and "users", obviously the destination 
folders for the files they contain.

"etc" contains fpc.cfg

"usr" contains the directories bin, lib and share with their appropriate 
content.

Now with the "deeply embedded" QNAP, the root directory is on a RAM file 
system (extracted together with the Kernel when booting) and will be 
reconstructed with any boot. Thus it does not make sense to copy the 
files there.

So I created a directory "debian" on the harddisk that is managed by the 
QNAP. and moved the extracted files in there relative to a fake root.

Now I copied fpc.cfg to /etc and created symlinks
/usr/bin/fpc -> xxx/debian/usr/bin/fpc            and
/usr/lib/fpc -> xxx/debian/usr/lib/fpc

So there is
xxx/debian/usr/lib/fpc/2.4.0/ppcarm

I can happily run this executable:

[/share/Public/debian/usr/lib/fpc/2.4.0] # ./ppcarm
Free Pascal Compiler version 2.4.0-2 [2010/02/20] for arm
Copyright (c) 1993-2009 by Florian Klaempfl
/share/MD0_DATA/Public/debian_test/usr/lib/fpc/2.4.0/ppcarm [options] 
<inputfile> [options]
Put + after a boolean switch option to enable it, - to disable it
   -a     The compiler doesn't delete the generated assembler file
       -al        List sourcecode lines in assembler file
       -an        List node info in assembler file
       -ap        Use pipes instead of creating temporary assembler files
       -ar        List register allocation/release info in assembler file
       -at        List temp allocation/release info in assembler file
   -A<x>  Output format:
       -Adefault  Use default assembler
       -Aas       Assemble using GNU AS
   -b     Generate browser info
       -bl        Generate local symbol info
   -B     Build all modules
   -C<x>  Code generation options:
       -Ca<x>     Select ABI, see fpc -i for possible values
       -Cb        Generate big-endian code
       -Cc<x>     Set default calling convention to <x>
       -CD        Create also dynamic library (not supported)
       -Ce        Compilation with emulated floating point opcodes
*** press enter ***


After I found that I additionally need to do a link

/usr/bin/ppcarm -> xxx/debian/usr/lib/fpc/2.4.0/ppcarm

I also happily can run "fpc":

[~] # fpc -v
Free Pascal Compiler version 2.4.0-2 [2010/02/20] for arm
Copyright (c) 1993-2009 by Florian Klaempfl
Fatal: No source file name in command line
Fatal: Compilation aborted
Error: /usr/bin/ppcarm returned an error exitcode (normal if you did not 
specify a source file to be compiled)


Now trying to compile .....

[/share/Public/heizarm] # cat hello.pas
begin
   writeln ( 'hello fpc');
end.
[/share/Public/heizarm] # fpc hello.pas
Free Pascal Compiler version 2.4.0-2 [2010/02/20] for arm
Copyright (c) 1993-2009 by Florian Klaempfl
Target OS: Linux for ARMEL
Compiling hello.pas
Assembling program
Linking hello
3 lines compiled, 0.3 sec
[/share/Public/heizarm] # ./hello
hello fpc

Works !!!!


Now trying to compile the (commandline) project I created and tested 
using Lazarus on a Linux PC.

Same obviously needs several additional packages providing the necessary 
units form the rtl and the fcl. It also needs synapse, but here I simply 
add the directory with the synapse source files to my project.

I found the appropriate three Debian packages and used the method 
described above to manually install them. These packages provide .ppu 
and o files but no sources.

I now have:


[/usr/bin] # ls -l | more
...
lrwxrwxrwx    1 admin    administ       12 Dec  5 05:35 find -> 
/bin/busybox*
lrwxrwxrwx    1 admin    administ       37 Jan 18 20:24 fpc -> 
/share/Public/debian/usr/bin/fpc*
...

[/usr/lib] # ls -l | more
drwxr-xr-x    4 admin    administ     4096 Dec  5 04:52 cups/
lrwxrwxrwx    1 admin    administ       37 Jan 19 13:52 fpc -> 
/share/Public/debian/usr/lib/fpc/
...

[/usr/lib/fpc/2.4.0] # ls -l
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 msg/
-rwxr-xr-x    1 admin    administ  1921892 Feb 20  2010 ppcarm*
-rwxr-xr-x    1 admin    administ    12929 Feb 20  2010 samplecfg*
drwxr-xr-x    3 admin    administ     4096 Feb 20  2010 units/


[/usr/lib/fpc/2.4.0/units/arm-linux] # ls -l
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 fcl-async/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 fcl-base/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 fcl-db/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 fcl-fpcunit/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 fcl-image/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 fcl-json/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 fcl-net/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 fcl-passrc/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 fcl-process/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 fcl-registry/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 fcl-res/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 fcl-web/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 fcl-xml/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 fpmkunit/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 hash/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 ncurses/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 pasjpeg/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 paszlib/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 regexpr/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 rtl/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 uuid/
drwxr-xr-x    2 admin    administ     4096 Feb 20  2010 x11/
[/usr/lib/fpc/2.4.0/units/arm-linux] #




Now I can compile the project, but linking it does not work:
================================================================================
[/share/Public/heizarm] # fpc heiz.lpr
Free Pascal Compiler version 2.4.0-2 [2010/02/20] for arm
Copyright (c) 1993-2009 by Florian Klaempfl
Target OS: Linux for ARMEL
Compiling heiz.lpr
Compiling inifiles.pp
Compiling contnrs.pp
contnrs.pp(2736,12) Warning: Converting pointers to signed integers may 
result in wrong comparison results and range errors, use an unsigned 
type instead.
Writing Resource String Table file: contnrs.rst
Assembling contnrs
inifiles.pp(245,15) Warning: Converting pointers to signed integers may 
result in wrong comparison results and range errors, use an unsigned 
type instead.
inifiles.pp(259,15) Warning: Converting pointers to signed integers may 
result in wrong comparison results and range errors, use an unsigned 
type instead.
inifiles.pp(537,3) Note: Local variable "M" not used
inifiles.pp(542,5) Note: Local variable "l2" not used
inifiles.pp(666,5) Note: Local variable "bAppendNextLine" not used
inifiles.pp(666,22) Note: Local variable "bAppended" not used
Assembling inifiles
Compiling work.pas
Compiling work1611.pas
Compiling httpsend.pas
Compiling blcksock.pas
Compiling synafpc.pas
Assembling synafpc
Compiling synsock.pas
Assembling synsock
Compiling synautil.pas
synautil.pas(1922,3) Note: Local variable "BackStop" is assigned but 
never used
Assembling synautil
Compiling synacode.pas
Assembling synacode
Compiling synaip.pas
Assembling synaip
Assembling blcksock
Assembling httpsend
Assembling work1611
Compiling workmail.pas
Compiling smtpsend.pas
Assembling smtpsend
Compiling pop3send.pas
Assembling pop3send
Compiling mimemess.pas
Compiling mimepart.pas
Compiling synachar.pas
Compiling synaicnv.pas
Assembling synaicnv
Assembling synachar
Compiling mimeinln.pas
Assembling mimeinln
Assembling mimepart
Assembling mimemess
workmail.pas(77,3) Note: Private field "TSMTPWork.SMTPSend" is never used
Assembling workmail
Assembling work
Assembling heiz
Linking heiz
/usr/lib/fpc/2.4.0/units/arm-linux/rtl/cprt0.o: In function 
`_haltproc_eabi':
(.text+0x88): undefined reference to `_fini'
/usr/lib/fpc/2.4.0/units/arm-linux/rtl/cprt0.o: In function 
`_haltproc_eabi':
(.text+0x90): undefined reference to `_init'
heiz.lpr(89) Error: Error while linking
heiz.lpr(89) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted
Error: /usr/bin/ppcarm returned an error exitcode (normal if you did not 
specify a source file to be compiled)
[/share/Public/heizarm] #
================================================================================

I found, that _fini and _init *should* be provided by crti.o which is 
not included in the packages I installed. And I don't know how to find 
out which package might provide it.

Rather disappointed I tried to compile the crti.s file from the svn.

After renaming it to crti.S and commenting out the two".type" lines, 
that gcc (installed as an ipkg) does not like, it can be compiled to 
crti.o:

[/share/Public/heizarm] # cat crti.S
===============================================================
//
//Copyright 2001, QNX Software Systems Ltd. All Rights Reserved
//
// QNX has kindly released this source code under the QNX open
// Community license, expressly to be used with  the
// Free Pascal runtime library
//

         .section .init
         .globl  _init
//      .type   _init, at function
_init:

         .section .fini
         .globl  _fini
//      .type   _fini, at function
_fini:
===============================================================

To make it aware to the linker, I added an appropriate line
{L crti.o}
to the heiz.lpr file.

Now the project can be linked.

But unfortunately it does not run:

[/share/Public/heizarm] # ./heiz
Segmentation fault
[/share/Public/heizarm] #


How to proceed ?

I never use any crt stuff, only writeln() is used, and same does work in 
the "hello" project. Thus the initialization of the crt stuff seems like 
a dummy task but should not crash, anyway.

I have no idea why the project needs _init and _fini and thus crti.o. 
According to the svn files, "haltproc_eabi" is used in system.pp and 
provided by cprt0.as.
I don speak are assembler and I am only acquainted with the gcc type 
assembler file (.s or .S rather than .as). So I don't understand what is 
done in the ARM version of cprt0.

Thanks for any help,
-Michael







More information about the fpc-devel mailing list