compiled executable crashes with 'illegal instruction'

Kai Ruottu kai.ruottu@wippies.com
Mon Dec 27 21:48:00 GMT 2010


27.12.2010 21:41, Vangelis Rokas kirjoitti:
>
> I am trying cross compile GCC 4.5.2 for ARM ( Faraday FA526 arm processor, armv4)
 > from Fedora Linux 14 using GCC 4.5.1
>
> I use the following packages:
> gmp-5.0.1
> mpfr-3.0.0
> mpc-0.8.2
>
> .. and ...
>
> binutils-2.21
> newlib-1.18.0
>
> The command lines to build the sources are:
>
> I use configure invoked inside ./build directory to build Makefiles:
> ./../$GCC/configure --target=$TARGET --prefix=$PREFIX --enable-interwork --disable-multilib --enable-languages="c,c++" --with-newlib --with-gmp-include=$(pwd)/gmp --with-gmp-lib=$(pwd)/gmp/.libs --without-headers --disable-shared --disable-libssp --disable-nls --disable-hardfloat --enable-threads=single --with-gnu-as --with-gnu-ld
>
> where:
> TARGET=arm-eabi
> PREFIX=/usr/local/arm
>
> after that I issue: make -j2
> and then : make install
>
> Compilation ends after 10-15 mins and the tree correctly placed under /usr/local/arm
>
> for main.c:
> #include<stdio.h>
> void main(void) { printf("Hello World\n"); }
>
> I can issue:
> arm-eabi-gcc main.c -o t
>
> When I try to run the above executable in ARM Linux enviroment,
> it crashes with the message: 'Illegal instruction'.

What on earth has put you to think that 'arm-eabi' target is
the same target as 'arm-linux-gnueabi' ?  The first is only
a bare iron embedded target, the latter is GNU/Linux, a system
target !

> Can you help to correctly build GCC ? What are the parameters that should give to
> configure in order for GCC to be properly buld for ARM enviroment?

  .../configure --target=arm-linux-gnueabi ....

For other parameters please consult the current/earlier native
GCC. As default a cross GCC for a system target is "another
incarnation of the already existing native GCC", ie the egg that
exists before the becoming chicken or vice versa... As default
a cross GCC for an embedded target will be built from scratch,
there is no already existing native GCC and one cannot even create
such with the produced cross GCC !  In your 'arm-eabi' case there
are no native GCCs for it :(

So the build is quite alike with the build of a native GCC, the
prerequisites being existing binutils for the $target and existing
C library for the $target. For a native GCC these are in '/usr/bin',
'/usr/include', '/usr/lib' and '/lib', for a cross GCC in
'$prefix/$target/bin', '$sysroot/usr/include', '$sysroot/usr/lib'
and '$sysroot/lib'. The $sysroot is the place for the root filesystem
for the $target on the cross $host system and at least has the target
C library "as it is", copied from the existing target system. Should
be very simple...



More information about the Gcc-help mailing list