Design de software em C, C++, Java, etc…
Today I needed to create 32 bit binaries of a program but I had only a 64 bit FreeBSD 8 machine. I must say that I am far from being a FreeBSD expert like some guys I know, so maybe there is a better way for doing this. But… was the only way I found.
In Linux I often do this by using a tool called crosstool. The crosstool is a series of scripts that makes the process of building a custom toolchain so easy that my 9-year daughter is able to create her custom toolchain…
I googled and could not find anything like crosstool for BSD, the easiest way I found is by creating a chroot for i386 architecture and compiling the program inside the chroot. The information published here I found in many forums and pages about freebsd. Following are the steps I’ve done:
% mkdir /usr/x86/ % cd /usr/src % make TARGET_ARCH=i386 buildworld % make TARGET_ARCH=i386 DESTDIR=/usr/x86 installworld
You’ll need some coffee to wait the compilation to end. After that the base system is inside /usr/x86, but you still need to create the proc filesystem. You can do this:
% mkdir /usr/x86/proc % mount -t procfs proc /usr/x86/proc
Now you must be able to chroot to your brand new x86 kernel. Just type:
% chroot /usr/x86
After that I realized that I still need some files that are outside the new root, so I needed to mount a nullfs for the directories containing those files:
#get out from jail % exit #mount /usr/ports and /usr/local/include inside the <em>jail</em> % mkdir -p /usr/x86/usr/ports % mkdir -p /usr/x86/usr/local/include % mount -t nullfs /usr/ports /usr/x86/usr/ports % mount -t nullfs /usr/local/include /usr/x86/usr/local/include #get in the jail again % chroot /usr/x86 # build CMake ( this is optional ) % cd /usr/ports/devel/cmake % make && make install #build boost libraries needed % cd /tmp/boost/tools/build/v2/ % ./bootstrap.sh % ./bjam install %/usr/local/bin/bjam --with-thread --with-regex --with-filesystem --layout=tagged # compile the program % cd ~/<project-name>/build % cmake ../src/ % make
To assert that the file is x86 type:
% file <binary-name> <binary-name>: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 8.2, stripped
That’s it… hope it helps somebody.