0
votes

I'm running fedora LXDE and I'm trying to cross-compile for ARM for my research. After looking through the internet I downloaded the packages:arm-linux-gnu-cpp and arm-linux-gnu-binutils and tried to use them to compile a hello world C program. I got the following:

[aejjeh@localhost ARMtests]$ arm-linux-gnu-gcc -v hello.c
Using built-in specs.
COLLECT_GCC=arm-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/arm-linux-gnueabi/5.1.1/lto-wrapper
Target: arm-linux-gnueabi
Configured with: ../gcc-5.1.1-20150618/configure --bindir=/usr/bin --build=x86_64-redhat-linux-gnu --datadir=/usr/share --disable-decimal-float --disable-dependency-tracking --disable-gold --disable-libgcj --disable-libgomp --disable-libmudflap --disable-libquadmath --disable-libssp --disable-libunwind-exceptions --disable-nls --disable-plugin --disable-shared --disable-silent-rules --disable-sjlj-exceptions --disable-threads --with-ld=/usr/bin/arm-linux-gnu-ld --enable-__cxa_atexit --enable-checking=release --enable-gnu-indirect-function --enable-gnu-unique-object --enable-initfini-array --enable-languages=c,c++ --enable-linker-build-id --enable-nls --enable-obsolete --enable-plugin --enable-targets=all --exec-prefix=/usr --host=x86_64-redhat-linux-gnu --includedir=/usr/include --infodir=/usr/share/info --libexecdir=/usr/libexec --localstatedir=/var --mandir=/usr/share/man --prefix=/usr --program-prefix=arm-linux-gnu- --sbindir=/usr/sbin --sharedstatedir=/var/lib --sysconfdir=/etc --target=arm-linux-gnueabi --with-bugurl=http://bugzilla.redhat.com/bugzilla/ --with-default-libstdcxx-abi=c++98 --with-isl --with-linker-hash-style=gnu --with-newlib --with-sysroot=/usr/arm-linux-gnu/sys-root --with-system-libunwind --with-system-zlib --without-headers --with-tune=cortex-a8 --with-arch=armv7-a --with-float=hard --with-fpu=vfpv3-d16 --with-abi=aapcs-linux
Thread model: single
gcc version 5.1.1 20150618 (Red Hat Cross 5.1.1-3) (GCC) 
COLLECT_GCC_OPTIONS='-v' '-march=armv7-a' '-mtune=cortex-a8' '-mfloat-abi=hard' '-mfpu=vfpv3-d16' '-mabi=aapcs-linux' '-mtls-dialect=gnu'
 /usr/libexec/gcc/arm-linux-gnueabi/5.1.1/cc1 -quiet -v hello.c -quiet -dumpbase hello.c -march=armv7-a -mtune=cortex-a8 -mfloat-abi=hard -mfpu=vfpv3-d16 -mabi=aapcs-linux -mtls-dialect=gnu -auxbase hello -version -o /tmp/cclJjDIf.s
GNU C11 (GCC) version 5.1.1 20150618 (Red Hat Cross 5.1.1-3) (arm-linux-gnueabi)
    compiled by GNU C version 5.1.1 20150618 (Red Hat 5.1.1-4), GMP version 6.0.0, MPFR version 3.1.2, MPC version 1.0.2
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/usr/arm-linux-gnu/sys-root/usr/local/include"
ignoring nonexistent directory "/usr/lib/gcc/arm-linux-gnueabi/5.1.1/../../../../arm-linux-gnueabi/include"
ignoring nonexistent directory "/usr/arm-linux-gnu/sys-root/usr/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/arm-linux-gnueabi/5.1.1/include
 /usr/lib/gcc/arm-linux-gnueabi/5.1.1/include-fixed
End of search list.
GNU C11 (GCC) version 5.1.1 20150618 (Red Hat Cross 5.1.1-3) (arm-linux-gnueabi)
    compiled by GNU C version 5.1.1 20150618 (Red Hat 5.1.1-4), GMP version 6.0.0, MPFR version 3.1.2, MPC version 1.0.2
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 6674f63c1f19a3bb91ffdaf6be2d26b1
hello.c:1:18: fatal error: stdio.h: No such file or directory
compilation terminated.

Then, after some digging around on the internet I found that arm-linux-gnu-gcc can only build kernel applications and not user applications. I also found that there is a package called arm-none-eabi-gcc, so I installed it and tried to use it. This time I get the following verbose output:

[aejjeh@localhost ARMtests]$ arm-none-eabi-gcc -v hello.c
Using built-in specs.
COLLECT_GCC=arm-none-eabi-gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/arm-none-eabi/5.2.0/lto-wrapper
Target: arm-none-eabi
Configured with: ../gcc-5.2.0/configure --prefix=/usr --mandir=/usr/share/man --with-pkgversion='Fedora 5.2.0-2.fc22' --with-bugurl=https://bugzilla.redhat.com/ --infodir=/usr/share/info --target=arm-none-eabi --enable-interwork --enable-multilib --with-python-dir=arm-none-eabi/share/gcc-5.2.0/python --with-multilib-list=armv6-m,armv7-m,armv7e-m,armv7-r --enable-plugins --disable-decimal-float --disable-libffi --disable-libgomp --disable-libmudflap --disable-libquadmath --disable-libssp --disable-libstdcxx-pch --disable-nls --disable-shared --disable-threads --disable-tls --enable-languages=c,c++ --with-newlib --disable-nls --disable-shared --disable-threads --with-gnu-as --with-gnu-ld --with-gmp --with-mpfr --with-mpc --with-headers=/usr/arm-none-eabi/include --with-system-zlib
Thread model: single
gcc version 5.2.0 (Fedora 5.2.0-2.fc22) 
COLLECT_GCC_OPTIONS='-v'
 /usr/libexec/gcc/arm-none-eabi/5.2.0/cc1 -quiet -v -D__USES_INITFINI__ hello.c -quiet -dumpbase hello.c -auxbase hello -version -o /tmp/cc85rCKv.s
GNU C11 (Fedora 5.2.0-2.fc22) version 5.2.0 (arm-none-eabi)
    compiled by GNU C version 5.1.1 20150618 (Red Hat 5.1.1-4), GMP version 6.0.0, MPFR version 3.1.2, MPC version 1.0.2
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/usr/lib/gcc/arm-none-eabi/5.2.0/../../../../arm-none-eabi/sys-include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/arm-none-eabi/5.2.0/include
 /usr/lib/gcc/arm-none-eabi/5.2.0/include-fixed
 /usr/lib/gcc/arm-none-eabi/5.2.0/../../../../arm-none-eabi/include
End of search list.
GNU C11 (Fedora 5.2.0-2.fc22) version 5.2.0 (arm-none-eabi)
    compiled by GNU C version 5.1.1 20150618 (Red Hat 5.1.1-4), GMP version 6.0.0, MPFR version 3.1.2, MPC version 1.0.2
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 615d73086bf155d17af97f0830ed8504
hello.c:1:18: fatal error: stdio.h: No such file or directory
compilation terminated.

and if I try to compile a C code that doesn't use any printfs I got the following:

[aejjeh@localhost ARMtests]$ arm-none-eabi-gcc hello.c
/usr/lib/gcc/arm-none-eabi/5.2.0/../../../../arm-none-eabi/bin/ld: cannot find crt0.o: No such file or directory
/usr/lib/gcc/arm-none-eabi/5.2.0/../../../../arm-none-eabi/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status

If anyone can point out what I'm doing wrong or if there is a different way I can get the cross-compiler working please let me know.

1
Your tool chain is not installed correctly or system path is not set correctly. Compiler can not find standard headers and libraries. If you are using hard float, I recommend arm-linux-gnueabihf-gcc and arm-linux-gnueabihf-g++, hf for hard float. The float ABI can not be changed arbitrary, because your binary need to match the ABI of the standard libraries on the device file system or dynamic linking would fail.user3528438
@ user3528438: I installed the toolchain using dnf. I couldn't figure out how to get the standard headers and libraries.adelejjeh

1 Answers

1
votes

I recently needed to set up a fedora box for arm cross-compiling. I wanted to use the dnf packages instead of downloading linaro binaries like I have in the past. dnf search arm eventually led me to this package list:

$ sudo dnf install gcc-arm-linux-gnu binutils-arm-linux-gnu glibc-arm-linux-gnu

$ arm-linux-gnu-gcc hello.c 
$ file a.out
a.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=4fa9ce3405cf64f9019f0c39e82fc97d8f4e5190, with debug_info, not stripped

Edit: I noticed that sys/ include files aren't picked up by default. There may be a better way, but passing -I works in a pinch:

$ arm-linux-gnu-gcc -I /usr/arm-linux-gnu/include srcfile.c

Edit2: The need for passing -I is discussed in https://bugzilla.redhat.com/show_bug.cgi?id=1456209

Edit3: My original answer didn't install C++ or the cross-compiled libstdc++-devel package. The C++ cross compiler is easy:

$ sudo dnf install gcc-c++-arm-linux-gnu

But oddly, there doesn't seem to be a package for the C++ library readily available. My best guess is that you'd need to download the C++ library source and compile it with the cross compilers.