为什么arm-linux-gnueabi-g+ -4.4总是构建一个“7-A”二进制?

时间:2021-03-29 09:11:28

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.

我正在运行Ubuntu 12:04LTS,安装了arm-linux-gnueabi C和c++编译器。编译后的二进制文件不会在我的目标板上运行。即使我指定了cpu和arch,编译器仍然会为错误的cpu构建一个二进制文件。而不是atm9tdmi构建和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;
}

2 个解决方案

#1


7  

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.

编译器支持armv4t,问题是链接器必须将对象文件与其他文件(如libc、crt)链接在一起。o创建可执行文件。然而,在您的工具链中,所有这些文件都被编译为7-A,因此结果可执行文件也是一个。这是ubuntu交叉工具链的一个问题,默认情况下是armv7a。

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

$ 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.

因此,工具链不仅仅是一个编译器,它的每个组件都需要执行。

#2


1  

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):

“配置”为您的ARM -linux-gnueabi-g+ -4.4的“配置”表明,编译器不是为arm9而构建,而是为ARMv7构建的,也就是ARM (ARM)(尽管它缺少混合臂/大拇指的interwork选项):

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

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

#1


7  

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.

编译器支持armv4t,问题是链接器必须将对象文件与其他文件(如libc、crt)链接在一起。o创建可执行文件。然而,在您的工具链中,所有这些文件都被编译为7-A,因此结果可执行文件也是一个。这是ubuntu交叉工具链的一个问题,默认情况下是armv7a。

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

$ 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.

因此,工具链不仅仅是一个编译器,它的每个组件都需要执行。

#2


1  

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):

“配置”为您的ARM -linux-gnueabi-g+ -4.4的“配置”表明,编译器不是为arm9而构建,而是为ARMv7构建的,也就是ARM (ARM)(尽管它缺少混合臂/大拇指的interwork选项):

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

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