Recent

Author Topic: Crosscompiling to i386 - fcllaz ?  (Read 8134 times)

dbannon

  • Hero Member
  • *****
  • Posts: 2778
    • tomboy-ng, a rewrite of the classic Tomboy
Crosscompiling to i386 - fcllaz ?
« on: November 27, 2017, 08:57:59 am »
Hi Folks, setting up a 64bit Ubuntu box to do cross compiling. Have successfully set it up to build 32bit and 64bit Windows but rather ironically cannot get the 32bit linux target to work.

Initially followed http://wiki.lazarus.freepascal.org/Cross_compiling#From_Linux_x64_to_Linux_i386 but was bitten by the bug mentioned here - http://forum.lazarus.freepascal.org/index.php?topic=32388.0 so followed ykot's recipe and then it all compiled.

But now, in lazarus, if I try and use that build mode, it fails during an attempt to compile fcllaz.pas, looks like a file created to install the FCL - do I need to install a separate 32bit FCL ? 

I am using Lazarus 1.8RC3.

Thanks, David
Lazarus 2, Linux (and reluctantly Win10, OSX)
My Project - https://github.com/tomboy-notes/tomboy-ng and my github - https://github.com/davidbannon

Handoko

  • Hero Member
  • *****
  • Posts: 5122
  • My goal: build my own game engine using Lazarus
Re: Crosscompiling to i386 - fcllaz ?
« Reply #1 on: November 27, 2017, 09:21:53 am »
I'm a Ubuntu 64-bit user. I rarely target to i386, but I ever managed to make it works.

# Cross Compile From Linux-x64 to Linux-i386
01. Need libc6-dev-i386
02. Save i386-linux-as to /usr/bin folder
03. Save i386-linux-ld to /usr/bin folder
04. sudo chmod +x /usr/bin/i386-linux-as
05. sudo chmod +x /usr/bin/i386-linux-ld
06. cd /usr/share/fpcsrc/3.0.4
07. sudo make clean all CPU_TARGET=i386
08. sudo make crossinstall OS_TARGET=linux CPU_TARGET=i386  INSTALL_PREFIX=/usr
09. sudo ln -sf /usr/lib/fpc/3.0.4/ppcross386 /usr/bin/ppc386

Note:
- 01. You can use Synaptic Package Manager to install libc6-dev-i386 package.
- 02. & 03. They can be found at the attachment below.
- 06. & 09. You have to change the red texts to the version of your FPC.

dbannon

  • Hero Member
  • *****
  • Posts: 2778
    • tomboy-ng, a rewrite of the classic Tomboy
Re: Crosscompiling to i386 - fcllaz ?
« Reply #2 on: November 27, 2017, 11:38:13 am »
Thanks Handoko

I do have libc6-dev-i386, the script I ran created i386-linux-as and i386-linux-ld, they appear almost identical to yours, both are executable. So I ran your versions of the three command.

And, Lazarus was a heap happier, compiled but it did not link.
Code: [Select]
MyProj Warning: "crtn.o" not found, this will probably cause a linking failure
/usr/bin/ld: cannot find -lpangocairo-1.0_NG.lpr(24,1)
Tomboy_NG.lpr(24,1) Error: Error while linking

Now, obviously, pangocairo (64 and 32) is installed and crtn has to be.

So, quick look in /etc/fpc.cfg -  it shows -
Code: [Select]
#ifdef cpui386
-Fl/usr/lib/gcc/x86_64-linux-gnu/6   
#endif

The 32bit files are in /usr/lib/gcc/x86_64-linux-gnu/6/32 but altering the setting made no difference.   

And libpangocairo ?  Its in /usr/lib/i386-linux-gnu so I added that in as a -Fl in project options, made no difference !
Handoko, would you mind showing me what your fpc.cfg looks like ?  Around "# path to the gcclib" please ?

Sigh ....

David


 
 
Lazarus 2, Linux (and reluctantly Win10, OSX)
My Project - https://github.com/tomboy-notes/tomboy-ng and my github - https://github.com/davidbannon

molly

  • Hero Member
  • *****
  • Posts: 2330
Re: Crosscompiling to i386 - fcllaz ?
« Reply #3 on: November 27, 2017, 11:47:55 am »
do I need to install a separate 32bit FCL ? 
Yes. You can either download them and copy manually to the required (sub)directories or you can compile them from source (make sure to select the correct target cpu/platform) . Compiling from source is more convenient in the end as it allows to compile for any other supported target (in case you have binutils, startup files/libraries present for the target you wish to support).

Make sure you have something like the following located in your fpc.cfg (windows based):
Quote
-FuDrive:Path_to_FPC\$FPCVERSION\units\$FPCTARGET\*
You could omit the $FPCVERSION macro if you only have one FPC version installed. Make sure the directories match your setup.

Note that using lazarus acts in a similar fashion and also requires (re)compilation on a widgetset change.

And, Lazarus was a heap happier, compiled but it did not link.
Code: [Select]
MyProj Warning: "crtn.o" not found, this will probably cause a linking failure
/usr/bin/ld: cannot find -lpangocairo-1.0_NG.lpr(24,1)
Tomboy_NG.lpr(24,1) Error: Error while linking

Now, obviously, pangocairo (64 and 32) is installed and crtn has to be.
Are you sure ? e.g. are you able to locate crtn.o ?

I don't know if installing build-essentials is still required ? at least libc6-dev-i386 seems to contain crtn.o as indicated by Handoko (/usr/lib/i386-linux-gnu/crtn.o)
Quote
Sigh ....
If it would be easy then everyone would be able to do it  :D
« Last Edit: November 27, 2017, 12:22:51 pm by molly »

Handoko

  • Hero Member
  • *****
  • Posts: 5122
  • My goal: build my own game engine using Lazarus
Re: Crosscompiling to i386 - fcllaz ?
« Reply #4 on: November 27, 2017, 12:34:03 pm »
o, would you mind showing me what your fpc.cfg looks like ?

Code: [Select]
#
# Config file generated by fpcmkcfg on 31-10-17 - 20:03:18
# Example fpc.cfg for Free Pascal Compiler
#

# ----------------------
# Defines (preprocessor)
# ----------------------

#
# nested #IFNDEF, #IFDEF, #ENDIF, #ELSE, #DEFINE, #UNDEF are allowed
#
# -d is the same as #DEFINE
# -u is the same as #UNDEF
#

#
# Some examples (for switches see below, and the -? helppages)
#
# Try compiling with the -dRELEASE or -dDEBUG on the commandline
#

# For a release compile with optimizes and strip debuginfo
#IFDEF RELEASE
  -O2
  -Xs
  #WRITE Compiling Release Version
#ENDIF

# For a debug version compile with debuginfo and all codegeneration checks on
#IFDEF DEBUG
  -gl
  -Crtoi
  #WRITE Compiling Debug Version
#ENDIF

# assembling
#ifdef darwin
# use pipes instead of temporary files for assembling
-ap
# path to Xcode 4.3+ utilities (no problem if it doesn't exist)
-FD/Applications/Xcode.app/Contents/Developer/usr/bin
#endif

# ----------------
# Parsing switches
# ----------------

# Pascal language mode
#      -Mfpc      free pascal dialect (default)
#      -Mobjfpc   switch some Delphi 2 extensions on
#      -Mdelphi   tries to be Delphi compatible
#      -Mtp       tries to be TP/BP 7.0 compatible
#      -Mgpc      tries to be gpc compatible
#      -Mmacpas   tries to be compatible to the macintosh pascal dialects
#
# Turn on Object Pascal extensions by default
#-Mobjfpc

# Assembler reader mode
#      -Rdefault  use default assembler
#      -Ratt      read AT&T style assembler
#      -Rintel    read Intel style assembler
#
# All assembler blocks are AT&T styled by default
#-Ratt

# Semantic checking
#      -S2        same as -Mobjfpc
#      -Sc        supports operators like C (*=,+=,/= and -=)
#      -Sa        include assertion code.
#      -Sd        same as -Mdelphi
#      -Se<x>     error options. <x> is a combination of the following:
#         <n> : compiler stops after <n> errors (default is 1)
#         w   : compiler stops also after warnings
#         n   : compiler stops also after notes
#         h   : compiler stops also after hints
#      -Sg        allow LABEL and GOTO
#      -Sh        Use ansistrings
#      -Si        support C++ styled INLINE
#      -Sk        load fpcylix unit
#      -SI<x>     set interface style to <x>
#         -SIcom    COM compatible interface (default)
#         -SIcorba  CORBA compatible interface
#      -Sm        support macros like C (global)
#      -So        same as -Mtp
#      -Sp        same as -Mgpc
#      -Ss        constructor name must be init (destructor must be done)
#      -Sx        enable exception keywords (default in Delphi/ObjFPC modes)
#
# Allow goto, inline, C-operators, C-vars
-Sgic

# ---------------
# Code generation
# ---------------

# Uncomment the next line if you always want static/dynamic units by default
# (can be overruled with -CD, -CS at the commandline)
#-CS
#-CD

# Set the default heapsize to 8Mb
#-Ch8000000

# Set default codegeneration checks (iocheck, overflow, range, stack)
#-Ci
#-Co
#-Cr
#-Ct

# Optimizer switches
# -Os        generate smaller code
# -Oa=N      set alignment to N
# -O1        level 1 optimizations (quick optimizations, debuggable)
# -O2        level 2 optimizations (-O1 + optimizations which make debugging more difficult)
# -O3        level 3 optimizations (-O2 + optimizations which also may make the program slower rather than faster)
# -Oo<x>     switch on optimalization x. See fpc -i for possible values
# -OoNO<x>   switch off optimalization x. See fpc -i for possible values
# -Op<x>     set target cpu for optimizing, see fpc -i for possible values

#ifdef darwin
#ifdef cpui386
-Cppentiumm
-Oppentiumm
#endif
#endif

# -----------------------
# Set Filenames and Paths
# -----------------------

# Both slashes and backslashes are allowed in paths

# path to the messagefile, not necessary anymore but can be used to override
# the default language
#-Fr/usr/lib/fpc/$fpcversion/msg/errore.msg
#-Fr/usr/lib/fpc/$fpcversion/msg/errorn.msg
#-Fr/usr/lib/fpc/$fpcversion/msg/errores.msg
#-Fr/usr/lib/fpc/$fpcversion/msg/errord.msg
#-Fr/usr/lib/fpc/$fpcversion/msg/errorr.msg

# search path for unicode binary files (FPC 2.x does not know this switch)
#ifndef VER2
-FM/usr/lib/fpc/../../share/fpc/$fpcversion/unicode/
#endif

# searchpath for units and other system dependent things
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl

#ifdef cpui8086
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/$fpcsubarch-$fpcmemorymodel
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/$fpcsubarch-$fpcmemorymodel/*
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/$fpcsubarch-$fpcmemorymodel/rtl
#endif

#IFDEF FPCAPACHE_1_3
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/httpd13/
#ELSE
#IFDEF FPCAPACHE_2_0
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/httpd20
#ELSE
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/httpd22
#ENDIF
#ENDIF

#IFDEF ANDROID
#IFDEF CPUARM
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl
#ENDIF
#ENDIF   

# searchpath for fppkg user-specific packages
-Fu~/.fppkg/lib/fpc/$fpcversion/units/$FPCTARGET/*

# path to the gcclib
#ifdef cpui386
-Fl/usr/lib/gcc/x86_64-linux-gnu/7
#endif
#ifdef cpux86_64
-Fl/usr/lib/gcc/x86_64-linux-gnu/7
#endif

# searchpath for libraries
#-Fl/usr/lib/fpc/$fpcversion/lib
#-Fl/lib;/usr/lib
-Fl/usr/lib/fpc/$fpcversion/lib/$FPCTARGET

# searchpath for tools
-FD/usr/lib/fpc/$fpcversion/bin/$FPCTARGET

#IFNDEF CPUI386
#IFNDEF CPUAMD64
#DEFINE NEEDCROSSBINUTILS
#ENDIF
#ENDIF

#IFNDEF Linux
#DEFINE NEEDCROSSBINUTILS
#ENDIF

# never need cross-prefix when targeting the JVM
# (no native compiler, always cross-compiling)
#ifdef cpujvm
#undef NEEDCROSSBINUTILS
#endif

# for android cross-prefix is set by compiler
#ifdef android
#undef NEEDCROSSBINUTILS
#endif

# never need cross-prefix when targeting the i8086
# (no native compiler, always cross-compiling)
#ifdef cpui8086
#undef NEEDCROSSBINUTILS
#endif

# never need cross-prefix when targeting the i8086
# (no native compiler, always cross-compiling)
#ifdef cpujvm
#undef NEEDCROSSBINUTILS
#endif

# binutils prefix for cross compiling
#IFDEF FPC_CROSSCOMPILING
#IFDEF NEEDCROSSBINUTILS
  -XP$FPCTARGET-
#ENDIF
#ENDIF


# -------------
# Linking
# -------------

# generate always debugging information for GDB (slows down the compiling
# process)
#      -gc        generate checks for pointers
#      -gd        use dbx
#      -gg        use gsym
#      -gh        use heap trace unit (for memory leak debugging)
#      -gl        use line info unit to show more info for backtraces
#      -gv        generates programs tracable with valgrind
#      -gw        generate dwarf debugging info
#
# Enable debuginfo and use the line info unit by default
#-gl

# always pass an option to the linker
#-k-s

# Always strip debuginfo from the executable
-Xs

# Always use smartlinking on i8086, because the system unit exceeds the 64kb
# code limit
#ifdef cpui8086
-CX
-XX
#endif


# -------------
# Miscellaneous
# -------------

# Write always a nice FPC logo ;)
-l

# Verbosity
#      e : Show errors (default)       d : Show debug info
#      w : Show warnings               u : Show unit info
#      n : Show notes                  t : Show tried/used files
#      h : Show hints                  s : Show time stamps
#      i : Show general info           q : Show message numbers
#      l : Show linenumbers            c : Show conditionals
#      a : Show everything             0 : Show nothing (except errors)
#      b : Write file names messages   r : Rhide/GCC compatibility mode
#          with full path              x : Executable info (Win32 only)
#      v : write fpcdebug.txt with     p : Write tree.log with parse tree
#          lots of debugging info
#
# Display Info, Warnings and Notes
-viwn
# If you don't want so much verbosity use
#-vw

dbannon

  • Hero Member
  • *****
  • Posts: 2778
    • tomboy-ng, a rewrite of the classic Tomboy
Re: Crosscompiling to i386 - fcllaz ?
« Reply #5 on: November 28, 2017, 03:18:59 am »
Thanks Handoko and Molly.

OK, still not working but skipping the things that did not help.

OK, well, Handoko's fpc.cfg looks pretty much the same as mine, this is the important bit for this issue -

Code: [Select]
# path to the gcclib
#ifdef cpui386
-Fl/usr/lib/gcc/x86_64-linux-gnu/7
#endif
#ifdef cpux86_64
-Fl/usr/lib/gcc/x86_64-linux-gnu/7
#endif

Note same path for 32bit as 64bit. I am pretty sure Handoko's 32bit code (specifically crtn.o and crti.o) is NOT in /usr/lib/gcc/x86_64-linux-gnu/7 but is maybe in /usr/lib/gcc/x86_64-linux-gnu/7/32/  OR in /usr/lib32

But Handoko's works ??

-Fl/usr/lib32 solves the crti and crtn issue but I still get
Code: [Select]
/usr/bin/ld: cannot find -lpangocairo-1.0
Now, I have /usr/lib/i386-linux-gnu/libpangocairo-1.0.so.0 so tried to -Fl to there. No good. Tried a symlink from /usr/lib/gcc/x86_64-linux-gnu/6/32 - still no good.

The error message puzzels me, is it literal ?  Is it actually looking for "-lpangocairo-1.0" or is it reporting thats whats on a command line somewhere ?  The later would make sense but I have told it very clearly where to find  pangocairo

During compile, it searches for and finds /usr/lib/fpc/3.0.3/units/i386-linux/gtk2/pangocairo.o  but ld still wants lpangocairo-1.0 

Molly, you are right, it would be no fun if it was too easy but does it really need to be this hard ?  ;-)

Davo
Lazarus 2, Linux (and reluctantly Win10, OSX)
My Project - https://github.com/tomboy-notes/tomboy-ng and my github - https://github.com/davidbannon

dbannon

  • Hero Member
  • *****
  • Posts: 2778
    • tomboy-ng, a rewrite of the classic Tomboy
Re: Crosscompiling to i386 - fcllaz ?
« Reply #6 on: November 28, 2017, 03:36:10 am »
One more thing I just noticed, the build (cross compiling to Linux32) is still using the 64bit linker.

It searches in a number of 32bit sounding places before settling on /usr/bin/ld   It does not search for /usr/bin/i386-linux-ld

So, I tried putting a copy (called ld) of i386-linux-ld in one of the places it searched and it was used (good) but did not solve the pangocairo problem (bad).

Davo
« Last Edit: November 28, 2017, 03:40:14 am by dbannon »
Lazarus 2, Linux (and reluctantly Win10, OSX)
My Project - https://github.com/tomboy-notes/tomboy-ng and my github - https://github.com/davidbannon

dbannon

  • Hero Member
  • *****
  • Posts: 2778
    • tomboy-ng, a rewrite of the classic Tomboy
Re: Crosscompiling to i386 - fcllaz ?
« Reply #7 on: November 28, 2017, 06:01:36 am »
OK, found it.  Getting a bit deperate I started checking the silly things and found, to my surprise, one.

like I said, I do have a /usr/lib/i386-linux-gnu/libpangocairo-1.0.so.0 but I don't have a /usr/lib/i386-linux-gnu/libpangocairo-1.0.so - I have no idea why not, pangocairo was installed using the normal Ubuntu package system and I'd expect it to be complete but no. ld looks for lib[name].so

Code: [Select]
root@Desktop:/usr/lib/i386-linux-gnu# ls -l libpangoc*
lrwxrwxrwx 1 root root    29 Mar  1  2017 libpangocairo-1.0.so.0 -> libpangocairo-1.0.so.0.4000.4
-rw-r--r-- 1 root root 50448 Mar  1  2017 libpangocairo-1.0.so.0.4000.4
root@Desktop:/usr/lib/i386-linux-gnu# ln -s libpangocairo-1.0.so.0.4000.4 libpangocairo-1.0.so

All good !

So, in summary, I suggest people follow ykot suggestion on http://forum.lazarus.freepascal.org/index.php/topic,32388.0.html (carefully noting that you need to insert your version of FPC in ln command).

Then, if your distro puts its 32 files in /usr/lib32 make your fpc.cfg look like this -
Code: [Select]
.....
# path to the gcclib
#ifdef cpui386                                 
# -Fl/usr/lib/gcc/x86_64-linux-gnu/6   
-Fl/usr/lib32
-Fl/usr/lib/gcc/x86_64-linux-gnu/6/32
#endif
.....

And, if it does not work, check to see that the symlinks associated with pangocairo are correct. You should have one library file with a full version number and two symlinks libpangocairo-1.0.so.0 and libpangocairo-1.0.so pointing to it.

I am unsure what action to take here. I think I found a couple of bugs -
1. FPC/Lazarus does not understand that debian distros like to put 32bit code in /usr/lib32
2. FPC/Lazarus looks for gcc code in /usr/lib/gcc/x86_64-linux-gnu/6/32 and not /usr/lib/gcc/x86_64-linux-gnu/6/32
3. pangocairo should create that that symlink as part of install

I'd like to at least, annotate the lazarus wiki cross compile page to that effect.
Thoughts ?
Thanks for your help with guys.

David


Lazarus 2, Linux (and reluctantly Win10, OSX)
My Project - https://github.com/tomboy-notes/tomboy-ng and my github - https://github.com/davidbannon

Handoko

  • Hero Member
  • *****
  • Posts: 5122
  • My goal: build my own game engine using Lazarus
Re: Crosscompiling to i386 - fcllaz ?
« Reply #8 on: November 28, 2017, 09:02:16 am »
Thank you for sharing what you've found.

I remember last time I tried my step-by-step cross compiling, it worked. So I wrote it down immediately. But I've just tested it again and it don't work anymore. It must be something changed after I upgraded my Ubuntu a month ago.

I tested all your suggestions, but still failed on the linking process. Something is still missing.

dbannon

  • Hero Member
  • *****
  • Posts: 2778
    • tomboy-ng, a rewrite of the classic Tomboy
Re: Crosscompiling to i386 - fcllaz ?
« Reply #9 on: November 28, 2017, 11:15:01 pm »
Handoko, I found using lazbuild revealed more of whats wrong with the linking process than the messages in the IDE. So try lazbuild an see if you can identify whats not being linked.

lazbuild -B --cpu="i386" --build-mode=ReleaseLin32 --os="linux" myproject.lpi

Where release-mode is one you have already defined in the IDE for that project.

David
Lazarus 2, Linux (and reluctantly Win10, OSX)
My Project - https://github.com/tomboy-notes/tomboy-ng and my github - https://github.com/davidbannon

renabor

  • Jr. Member
  • **
  • Posts: 73
Re: Crosscompiling to i386 - fcllaz ?
« Reply #10 on: July 30, 2021, 08:33:41 am »
Just tried to make crosspomiling from x86_64 to i386 on linux and following instructions found on this page:
https://wiki.freepascal.org/Cross_compiling#From_Linux_x64_to_Linux_i386
I was able to compile to target i386.
Run this script and you will have all you need:
Code: Pascal  [Select][+][-]
  1. #!/bin/bash
  2. sudo dpkg --add-architecture i386
  3. sudo apt update
  4. sudo apt install libc6-dev-i386  libx11-6:i386  libx11-dev:i386  libgdk-pixbuf2.0-0:i386  libatk1.0-dev:i386 libgdk-pixbuf2.0-dev:i386  libpango1.0-dev:i386  libgtk2.0-dev:i386 libnotify-dev:i386
  5. sudo echo $'#!/bin/bash\nld -A elf32-i386 "$@"' > /usr/bin/i386-linux-ld
  6. sudo echo $'#!/bin/bash\nas --32 "$@"' > /usr/bin/i386-linux-as
  7. sudo chmod +x /usr/bin/i386-linux-ld
  8. sudo chmod +x /usr/bin/i386-linux-as
  9.  
FPC 3.2.2 | Lazarus 2.2.3 | Kubuntu 22.04 64bit

dbannon

  • Hero Member
  • *****
  • Posts: 2778
    • tomboy-ng, a rewrite of the classic Tomboy
Re: Crosscompiling to i386 - fcllaz ?
« Reply #11 on: July 30, 2021, 03:17:43 pm »
 renabor, I respectfully suggest a script is not a good idea for a couple of reasons -

1. Easy to miss errors unless you make a script that checks for such errors,quite hard.
2. Different versions of linux put files in different places, sometimes that means changes to fpc.cfg, sometimes it means the commands you need to issue change a bit. 

So, a bit of discussion between commands is a good idea,

Now, I also note that you don't, in your script, make a 32bit  cross compiler. Perhaps you have already built one for win32 ?  Its the same thing. But in a fresh install, your script won't work because there is no ppcross386 "out of the box".

But thanks for your contribution anyway.

Davo
Lazarus 2, Linux (and reluctantly Win10, OSX)
My Project - https://github.com/tomboy-notes/tomboy-ng and my github - https://github.com/davidbannon

 

TinyPortal © 2005-2018