[fpc-devel] cross-compiling (linux program from Win32 platform)

Marco van de Voort marcov at stack.nl
Tue Aug 2 13:46:11 CEST 2005

> >> Sorry, Where I can found them?
> > 
> > 
> > I don't know; normally you must compile them yourself, but I suppose
> > they can be downloaded from various sites.
> Including the fpc ftp server:
> ftp://ftp.freepascal.org/pub/fpc/contrib/cross/mingw/
> win32crossbinutils2005.zip contains cross binutils from win32 to many 
> different targets.
> Read the BuildFAQ (google buildfaq.pdf) for an HOWTO setup a correct 
> build environment (fpc.cfg).

Here are some old notes I still have to add to the buildfaq: note that the cross binutils  have
been update since (see above link)

To compile linux lazarus on windows: (the procedure from freebsd will not differ much, the cprt0 copying is not needed for FreeBSD)

- FPC 1.9.6 or higher. 1.9.4 migh work, but untested.
- ftp://freepascal.stack.nl/pub/fpc/contrib/cross/mingw/binutils-2.15-win32-i386-linux.zip
- A FPC CVS repository.  (anything 1.9.6+ that is buildable will do)
- a lazarus tree. (anything buildable from the same period will do)
- Lots of libraries from the target linux system. One of the FPC servers is some SUSE, that's where I got the list below.

1) Download ftp://freepascal.stack.nl/pub/fpc/contrib/cross/mingw/binutils-2.15-win32-i386-linux.zip
2) extract it and move the i386* files to <fpcbindir>\bin\i386-win32  (e.g. c:\pp\bin\i386\win32)
3) enter FPC source dir
4) make clean 
5) make OS_TARGET=linux all
6) make OS_TARGET=linux install INSTALL_PREFIX=<fpcbindir>
7) prepare the lib directory as in below instructions,  I used d:\fpc\linuxlib to store them.
8) go to <fpcbindir>\units\i386-linux\rtl  and copy cprt21.o over cprt0.o
9) enter lazarus dir
10) edit lazarus.pp and add {$linklib dl} and {$linklib gmodule} somewhere in the source.
11) make OS_TARGET=linux all OPT="-gl -Fld:\fpc\linuxlib -Xr/usr/lib -FL/usr/lib/ld-linux.so.2 " 

If some linker error (most specifically linker can't find -l<something>) then

12) manually edit link.res if needed (see below for gtk remarks) and adapt the -l<x> names at the bottom of the files. I had to add -1.2 to all gtk
    libs, to keep them apart from gtk2
13) run ppas.bat to restart the linker

----------- Libraries

These are the libraries I collected for both lazarus and the textmode IDE (lazarus doesn't need pthread).

I gathered these from the target system, and renamed all from lib<name>.so.x.y to lib<name>.so.

libgcc.a and a few others are easiest found by doing gcc -v and look for a line like

"Reading specs from /usr/lib/gcc-lib/i486-linux/3.3.5/specs"

then some of the libs are in  /usr/lib/gcc-lib/i486-linux/3.3.5/
Some other good locations are /lib /usr/lib /usr/local/lib /usr/x11R6/lib and /opt/gnome/lib


Note that some directories are duplicate, with a suffix and not. These are required because some other lib has a dependancy on that 
exact name (so the form lib<name>.so.x) we can't symlink on windows, so I simply copy it.

Making mistakes with renaming is not that bad, there will be chances to fix it. Make sure all crt* and a file "libc.so" are available, otherwise
generating link.res will go wrong. (Yes, Peter, that was my fault :-)

In my case compilation for step 11 will go ok, but the linker will complain
it can't find libgtk.so and the other libraries marked with -1.2 This is
because on the target system, libgtk is gtk 2.0, while we want gtk1.2 for

To fix this I manually added -1.2 to the corresponding -l lines in the
bottom of the link.res file that was generated by step 11

More information about the fpc-devel mailing list