
次の仕様とハードウェア浮動小数点演算をサポートする組み込みデバイス用のC ++コードをクロスコンパイルする必要があります。ハードウェア浮動小数点をサポートせずにUbuntu 20.04でクロスコンパイルするのは簡単です。実行でき、arm-linux-gnueabi-g++ -marm -mcpu=arm926ej-s -mfloat-abi=soft -mfpu=vfp
機能します。私と一緒に走ると、-mfloat-abi=hard
次のようになります。
/usr/lib/gcc-cross/arm-linux-gnueabi/9/../../../../arm-linux-gnueabi/bin/ld: error: ArmSimulateStartStop uses VFP register arguments, /usr/lib/gcc-cross/arm-linux-gnueabi/9/crtbegin.o does not
/usr/lib/gcc-cross/arm-linux-gnueabi/9/../../../../arm-linux-gnueabi/bin/ld: failed to merge target specific data of file /usr/lib/gcc-cross/arm-linux-gnueabi/9/crtbegin.o
/usr/lib/gcc-cross/arm-linux-gnueabi/9/../../../../arm-linux-gnueabi/bin/ld: error: ArmSimulateStartStop uses VFP register arguments, /usr/lib/gcc-cross/arm-linux-gnueabi/9/crtend.o does not
/usr/lib/gcc-cross/arm-linux-gnueabi/9/../../../../arm-linux-gnueabi/bin/ld: failed to merge target specific data of file /usr/lib/gcc-cross/arm-linux-gnueabi/9/crtend.o
collect2: error: ld returned 1 exit status
make: *** [Makefile:12: CrossCompile] Error 1
私はこのプロセッサがハードウェア浮動小数点サポートをサポートしていることを知っています。腕文書。ダウンロードしましたルートディレクトリの構築そしてクロスツールしかし、私のデバイスのハードウェアに合わせて設定する方法がわかりません。クロスコンパイルにVFPサポートを使用するには?
機器仕様:
~ $ cat /proc/cpuinfo
Processor : ARM926EJ-S rev 5 (v5l)
BogoMIPS : 197.83
Features : swp half thumb fastmult edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant : 0x0
CPU part : 0x926
CPU revision : 5
~ $ cat /proc/version
Linux version 2.6.36 (owzafs@PCOWZAFS) (gcc version 4.4.1 (Sourcery G++ Lite 2010q1-202) ) #464 PREEMPT Thu Apr 19 13:50:56 CEST 2018
編集する:によると湾岸協力協議会文書:VFP補助プロセッサで-mfloat-abi = hardを使用することはサポートされていません。適切な-mfpuオプションを指定して-mfloat-abi = softfpを使用すると、コンパイラはこれらのCPUのハードウェア浮動小数点機能を利用するコードを生成できます。
mfloat-abi=softfp
しかし、私が得たデバイスでバイナリを実行するときにコードを使用してコンパイルしましたIllegal instruction
。
答え1
オブジェクトのように見え、crtbegin.o
メインラインのcrtend.o
ビルドと一致しません。
私の考えの最善の方法は、再コンパイルしcrtbegin.s
、crtend.s
同じ設定で再コンパイルし-mfloat-abi=hard
、別々に作成してcrtbegin.o
再crtend.o
試行することです。