8

I'm running Ubuntu 12:04LTS and installed arm-linux-gnueabi C and C++ compiler. The compiled binary won't run on my target board. It looks like even if I specify the cpu and arch, the compiler still builds a binary for the wrong CPU. Instead of atm9tdmi it build and 7-A.

Am I doing something wrong or is there something I should have configured? Thanks.

~/ArmTest$ arm-linux-gnueabi-g++-4.4 -mcpu=arm9tdmi -march=armv4t -O main.cpp -o CPPTest

~/ArmTest$ readelf -A CPPTest 
Attribute Section: aeabi
File Attributes
  Tag_CPU_name: "7-A"
  Tag_CPU_arch: v7
  Tag_CPU_arch_profile: Application
  Tag_ARM_ISA_use: Yes
  Tag_THUMB_ISA_use: Thumb-2
  Tag_FP_arch: VFPv3-D16
  Tag_ABI_PCS_wchar_t: 4
  Tag_ABI_FP_denormal: Needed
  Tag_ABI_FP_exceptions: Needed
  Tag_ABI_FP_number_model: IEEE 754
  Tag_ABI_align_needed: 8-byte
  Tag_ABI_align_preserved: 8-byte, except leaf SP
  Tag_ABI_enum_size: int
  Tag_ABI_HardFP_use: SP and DP
  Tag_CPU_unaligned_access: v6
  Tag_DIV_use: Not allowed
~/ArmTest$ file CPPTest 
CPPTest: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.31, BuildID[sha1]=0xf8e81f7a1bb3ee1200cb3dd1aa5b192ecc6de831, not stripped

 uname -a
Linux Desktop 3.2.0-32-generic-pae #51-Ubuntu SMP Wed Sep 26 21:54:23 UTC 2012 i686 athlon i386 GNU/Linux

:~/ArmTest$ arm-linux-gnueabi-g++-4.4 -v
Using built-in specs.
Target: arm-linux-gnueabi
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.4.7-1ubuntu2' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/arm-linux-gnueabi/include/c++/4.4.7 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --disable-sjlj-exceptions --with-arch=armv7-a --with-float=softfp --with-fpu=vfpv3-d16 --with-mode=thumb --disable-werror --enable-checking=release --program-prefix=arm-linux-gnueabi- --includedir=/usr/arm-linux-gnueabi/include --build=i686-linux-gnu --host=i686-linux-gnu --target=arm-linux-gnueabi --with-headers=/usr/arm-linux-gnueabi/include --with-libs=/usr/arm-linux-gnueabi/lib
Thread model: posix
gcc version 4.4.7 (Ubuntu/Linaro 4.4.7-1ubuntu2) 

:~/ArmTest$ cat main.cpp
#include<iostream>

using namespace std;

int main(){
   cout<<"Hello World"<<endl;
return 0;
}
Jim
  • 809
  • 1
  • 7
  • 18

2 Answers2

10

Your compiler supports armv4t, problem is your linker has to link your object file with other files like libc, crt.o to create an executable. However in your toolchain all those files have been compiled for 7-A, thus result executable ends up being one as well. This is a problem with ubuntu cross toolchains, they are armv7a by default.

If you just compile your source file, you'll see that compiler outputs right object file type.

$ arm-linux-gnueabi-g++-4.4 -mcpu=arm9tdmi -march=armv4t -O -c main.cpp -o CPPTest

$ readelf -A CPPTest
Attribute Section: aeabi
File Attributes
  Tag_CPU_name: "ARM9TDMI"
  Tag_CPU_arch: v4T
  Tag_ARM_ISA_use: Yes
  Tag_THUMB_ISA_use: Thumb-1
  Tag_FP_arch: VFPv3-D16
  Tag_ABI_PCS_wchar_t: 4
  Tag_ABI_FP_denormal: Needed
  Tag_ABI_FP_exceptions: Needed
  Tag_ABI_FP_number_model: IEEE 754
  Tag_ABI_align_needed: 8-byte
  Tag_ABI_align_preserved: 8-byte, except leaf SP
  Tag_ABI_enum_size: int
  Tag_ABI_HardFP_use: SP and DP
  Tag_ABI_optimization_goals: Prefer Speed
  Tag_DIV_use: Not allowed

So a toolchain is more than a compiler and every component of it needs to play along.

auselen
  • 27,577
  • 7
  • 73
  • 114
  • So how to link after just compiling?? – limovala May 22 '13 at 05:22
  • @AbhishekLal what do you want to do? – auselen May 22 '13 at 06:45
  • @limovala, it seems, that you need to rebuild the libraries for the architecture you want. For the first look it may seem scary, but the [buildroot](http://buildroot.uclibc.org) goes for the help! You just need to choose an exact libraries that you want via a pretty looking GUI, and issue a command `make`. Ask if you need a help(I am bad with the buildroot, but at least I finally got it to work, so there's I can help). – Hi-Angel Jul 04 '14 at 15:51
2

The "Configured with" line for your arm-linux-gnueabi-g++-4.4 clearly states that the compiler was not built for arm9 but ARMv7, i.e. ARM Cortex Ax (although it's missing the interwork option for mixed ARM/Thumb aka Thumb2 code):

Configured with: ... --with-arch=armv7-a --with-float=softfp --with-fpu=vfpv3-d16 --with-mode=thumb ...

You probably want a different compiler built as unspecified ARM.
Consider using BuildRoot to build a complete toolchain for your project.
Or download the gcc-4.0 or 4.1 toolchain from gnuarm.com

sawdust
  • 16,103
  • 3
  • 40
  • 50
  • That is what I figured but I wanted to make sure I wasn't just being stupid. I was also having problem with crosstool-ng as seen here http://stackoverflow.com/questions/12957977/how-to-i-get-crosstool-ng-c-compiler-working – Jim Oct 18 '12 at 21:51
  • The compiler also defaults to Thumb (16-bit rather than 32-bit) instructions, although some arm9 processors can deal with either. – sawdust Oct 18 '12 at 22:31
  • These configuration options affect only what code the compiler generates by default, not what code the compiler can generate. – unixsmurf Oct 19 '12 at 17:13
  • @unixsmurf does that answer imply there is a means to change the default behavior with the .deb packaged linker? if so how? – Jim Oct 23 '12 at 13:15
  • @Jim: Technically, yes, by not linking against the default libraries. Practically, no, unless you're building a self-contained image such as a Linux kernel. But my comment was more specifically that the compiler has nothing to do with this - the linker just always has to "promote" the image to the lowest common denominator of included object files - including system libraries. The key information from the gcc -v command is not the "--with-arch", but the "--with-libs". – unixsmurf Oct 23 '12 at 18:19