[fpc-pascal] Cross compiling x86_64 on i386 Linux.

Tony Whyman tony.whyman at mccallumwhyman.com
Tue May 29 10:40:04 CEST 2012


If you are using a Debian derived distribution such as Ubuntu, you might 
find it easier to use debootstrap to create a 64 bit environment on your 
system and compile the program in that environment (see 
https://help.ubuntu.com/community/DebootstrapChroot for a guide). Then 
you can be sure that you have all the correct libraries in their 
standard paths, etc.

In my set up, I compile for both 64 bit and 32 bit targets on a 64 bit 
machine and have separate debootstrap (chroots) for each target 
environment rather than compile in the development environment. This 
ensures that the final compilation takes place in a known clean 
environment. I also have a chroot for a win32 cross compiler.

Once you have created the chroot for each target, all you need to do is 
to install the fpc debs in the appropriate environment (64 bit fpc for 
the 64 bit environment, 32 bit for the 32 bit environment), install any 
other libraries you need for the distribution repository and then 
compile the software in each chroot separately. The result will be 
executables built for each target and built in a clean environment. If 
you also want to generate distribution packages (debs), this is also the 
best way to go about it.


Tony Whyman
MWA Software

On 29/05/12 03:19, Bruce Tulloch wrote:
> Closer, but not quite there yet...
> To get this going I've (sshfs) mounted a 64 bit system on /mnt/engels
> and then attempted to cross-compile on the 32 bit system with:
>    fpc -MDelphi -Scgi -CX -O3 -OoUNCERTAIN -OoREGVAR \
>    -Tlinux -Px86_64 -Xs -XX -va -l \
>    -dLCL -dLCLgtk2 -XR/mnt/engels
> This compiles but fails at the linker:
>    Searching file /mnt/engels/usr/lib64/crtn.o... found
>    Searching file /usr/local/opt/binutils/bin/x86_64-linux-ld... found
>    Using util /usr/local/opt/binutils/bin/x86_64-linux-ld
>    /usr/local/opt/binutils/bin/x86_64-linux-ld: skipping incompatible
> /lib/libpthread.so.0 when searching for /lib/libpthread.so.0
>    /usr/local/opt/binutils/bin/x86_64-linux-ld: cannot find
> /lib/libpthread.so.0
>    Error: Error while linking
>    Fatal: There were 1 errors compiling module, stopping
> The linker
>   /usr/local/opt/binutils/bin/x86_64-linux-ld
> was created using (an appropriately modified)
>    fpcfixes_2.6/cross/buildcrossbinutils
> i.e. built to run on i386 and target x86_64
>    MYINTEL=i386
>    TARGETS_X86_64="linux"
> and the pthread library is (presumably, given the -XR option)
>    /mnt/engels/lib/libpthread.so
> which file reports as
>    libpthread-2.11.3.so: ELF 64-bit LSB shared object, x86-64, version
>    1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux
>    2.6.18, not stripped
> How can I find out why x86_64-linux-ld reports it as incompatible?
> Many thanks, Bruce.
> On 05/28/12 23:02, Jonas Maebe wrote:
>> On 28 May 2012, at 14:56, Bruce Tulloch wrote:
>>> Am I correct to assume that if I drag in the x86_64 libraries I need
>>> from another x86_64 system, put them in a local directory and then
>>> reference then using the -XR option I can make this setup work?
>> -XR is for pointing the compiler/linker to the top of a complete sysroot (i.e., a hierarchy with /lib, /usr/lib etc), not to a directory with just few handpicked libraries. For the latter, use the -Fl command line switch instead, possibly combined with -Xd (to prevent the compiler from passing the default system directories as search paths to the linker).
>> And yes, that should indeed work fine.
>> Jonas_______________________________________________
>> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
>> http://lists.freepascal.org/mailman/listinfo/fpc-pascal
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-pascal

More information about the fpc-pascal mailing list