为什么arm-linux-gnueabi-g ++-4.4总是build立一个“7-A”二进制文件?

我正在运行Ubuntu 12:04LTS并安装了arm-linux-gnueabi C和C ++编译器。 编译后的二进制文件不能在我的目标板上运行。 看起来即使我指定了cpu和arch,编译器仍然为错误的CPU构build了一个二进制文件。 而不是atm9tdmi它build立和7-A。

我做错了什么,或者有什么我应该configuration? 谢谢。

~/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; } 

你的编译器支持armv4t,问题是你的链接器必须链接你的目标文件与其他文件如libc,crt.o来创建一个可执行文件。 然而,在你的工具链中,所有这些文件已经被编译为7-A,因此结果可执行文件最终也是一个。 这是Ubuntu的交叉工具链的问题,他们默认是armv7a。

如果你只是编译你的源文件,你会看到编译器输出正确的目标文件类型。

$ 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 

所以工具链不仅仅是编译器,它的每个组件都需要一起玩。

arm-linux-gnueabi-g++-4.4的“Configured with”一行清楚地表明,编译器不是为arm9构建的,而是为ARMv7构建的,即ARM Cortex Ax(尽管缺少混合ARM / Thumb或Thumb2代码的交互选项) :

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

您可能需要将一个不同的编译器构建为未指定的ARM。
考虑使用BuildRoot为您的项目构建一个完整的工具链。
或者从gnuarm.com下载gcc-4.0或4.1工具链