Cross compilation

Kai Ruottu kai.ruottu@wippies.com
Fri Nov 10 09:22:00 GMT 2017


RAVI DEWANGAN kirjoitti 10.11.2017 klo 4:56:
> Hi GNU Team,
>
> Could you please guide me regarding cross compilation.
>
> I am trying to cross compile the toolchain for FreeBSD11(target) using
> Ubuntu16.04(host).
>
> The issue is
> /home/rdewangan/freebsd/gcc-7.2.0/build/./gcc/xgcc
> -B/home/rdewangan/freebsd/gcc-7.2.0/build/./gcc/
> -B/opt/freebsd_toolchain/x86_64-pc-freebsd11/bin/
> -B/opt/freebsd_toolchain/x86_64-pc-freebsd11/lib/ -isystem
> /opt/freebsd_toolchain/x86_64-pc-freebsd11/include -isystem
> /opt/freebsd_toolchain/x86_64-pc-freebsd11/sys-include    -g -O2 -O2  -g
> -O2 -DIN_GCC  -DCROSS_DIRECTORY_STRUCTURE  -W -Wall -Wno-narrowing
> -Wwrite-strings -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes
> -Wold-style-definition  -isystem ./include   -fpic -pthread -g -DIN_LIBGCC2
> -fbuilding-libgcc -fno-stack-protector -Dinhibit_libc  -fpic -pthread -I.
> -I. -I../.././gcc -I../../../libgcc -I../../../libgcc/.
> -I../../../libgcc/../gcc -I../../../libgcc/../include  -DHAVE_CC_TLS  -o
> _muldi3.o -MT _muldi3.o -MD -MP -MF _muldi3.dep -DL_muldi3 -c
> ../../../libgcc/libgcc2.c -fvisibility=hidden -DHIDE_EXPORTS
> In file included from ../../../libgcc/../gcc/tsystem.h:44:0,
>                   from ../../../libgcc/libgcc2.c:27:
> /home/rdewangan/freebsd/gcc-7.2.0/build/gcc/include/stddef.h:56:10: fatal
> error: sys/_types.h: No such file or directory
>   #include <sys/_types.h>
>            ^~~~~~~~~~~~~~
> compilation terminated.
> Makefile:491: recipe for target '_muldi3.o' failed

For a "working compiler" one needs also the target C library. Prebuilt 
and pretested
in your case when your FreeBSD system is already made.  There isn't much 
difference
between a native and a cross compiler in this issue, both require the 
target C library
during the GCC build when the extra libraries : libgcc, libstdc++, 
libssp etc will be built.

A cross compiler needs also the binutils made for the "host-to-target" 
use but a native
build usually already has also them prebuilt, sometimes as non-GNU 
"native ones".

Furthermore the target C library must be put into a separate $SYSROOT on 
the host.
Not in it's "native" place (usually '/lib*', '/usr/include' and 
'/usr/lib*' like in Linux) but
in a sysroot like '/opt/freebsd_toolchain/sysroot' in your case, the 
native FreeBSD
sysroot '/' being replaced with this.

As you can see, you already have the cross compiler binaries made. Those 
which run
on your Linux host : the 
'/home/rdewangan/freebsd/gcc-7.2.0/build/./gcc/xgcc' is the
compiler driver ("x86_64-pc-freebsd11-gcc" after its installation), the 
"cc1", "cc1plus"
etc. also in the '/home/rdewangan/freebsd/gcc-7.2.0/build/gcc'.  But 
after this the new
GCC needs the target C library stuff like its headers when compiling 
'libgcc' etc for the
target.

>   1283  sudo ../configure --without-headers --with-gnu-as --with-gnu-ld
> --enable-languages=c,c++ --disable-nls --enable-libssp --enable-gold
> --enable-ld --target=x86_64-pc-freebsd11 --prefix=/opt/freebsd_toolchain
> --with-gmp=/opt/freebsd_toolchain --with-mpc=/opt/freebsd_toolchain
> --with-mpfr=/opt/freebsd_toolchain --disable-libgomp
>   1284  sudo LD_LIBRARY_PATH=/opt/freebsd_toolchain/lib make

A configure like this could be enough for making a "kernel compiler", 
for compiling an
Unix or Linux kernel from its sources. But not user-level libraries and 
applications.

The target C libraries used to be inside the FreeBSD install packages, 
'base.txz' and
'lib32.txz' or something. You must unpack them into some temporary place 
and copy
the needed parts from there into your chosen $SYSROOT. Or copy them from the
installed target system.  Then in the binutils and GCC configure use the :
--with-sysroot=$SYSROOT
to tell where the target C library stuff is....



More information about the Gcc-help mailing list