8

Ubuntu 12:04LTS を実行しており、arm-linux-gnueabi C および C++ コンパイラをインストールしています。コンパイルされたバイナリがターゲット ボードで実行されません。cpu と arch を指定しても、コンパイラは間違った CPU 用のバイナリをビルドするようです。atm9tdmi の代わりにビルドして 7-A.

私は何か間違ったことをしていますか、それとも設定する必要がありましたか? ありがとう。

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

2 に答える 2

10

コンパイラはarmv4tをサポートしています。問題は、リンカーがオブジェクトファイルをlibc、crt.oなどの他のファイルとリンクして実行可能ファイルを作成する必要があることです。ただし、ツールチェーンでは、これらすべてのファイルが 7-A 用にコンパイルされているため、結果の実行可能ファイルも 1 つになります。これは 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

したがって、ツールチェーンは単なるコンパイラではなく、そのすべてのコンポーネントが連携する必要があります。

于 2012-10-18T22:18:40.903 に答える
2

あなたの「Configured with」行はarm-linux-gnueabi-g++-4.4、コンパイラが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 ツールチェーンをダウンロードします。

于 2012-10-18T21:16:42.270 に答える