C++11 をサポートするようにコンパイラをアップグレードしようとしています。ターゲット マシンのカーネルは 2.6.33.20 です。
この目的のために、https: //releases.linaro.org/components/toolchain/binaries/ にあるビルド済みバイナリ、つまりバージョン 5.5.0 を使用しようとしています。
些細なテストプログラム
//#include <functional>
#include <stdio.h>
int main(void)
{
// auto lambda = [](int value) { printf("Wert: %d\n", value); };
// lambda(20);
printf("My output\n");
return 0;
}
コマンドで正常にコンパイルされますarm-linux-gnueabi-g++ -o test -static-libstdc++ -std=gnu++11 main.cpp
。
実行可能ファイルを実行するfile
と、test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=2d49dc2492f7fb2ee5992f7614604aac370e42f7, with debug_info, not stripped
.
file コマンドを同じソースに対して実行しますが、古い (C++11 より前の) コンパイラでコンパイルすると、次の結果が得られます。test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.14, not stripped
readelf -A
古い(動作中の)コンパイラのyieldの出力:
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "ARM10TDMI"
Tag_CPU_arch: v5T
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-1
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_enum_size: int
一方、新しいコンパイラによって生成された新しいコンパイラは、次の結果をもたらします。
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "7-A"
Tag_CPU_arch: v7
Tag_CPU_arch_profile: Anwendung
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-2
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_rounding: Needed
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_CPU_unaligned_access: v6
-mcpu=arm10tdmi
これに続いて、上記のコマンドにフラグを追加しました(結果はarm-linux-gnueabi-g++ -mcpu=arm10tdmi -o test main.cpp
) ですが、readelf の出力は同じままです。ARM フラグを使用する-march=arm5vt
と-mtune=arm10tdmi
、まったく同じ結果になります。
これは、コンパイラがアーキテクチャ フラグを無視し (または、ARM5 のビルドをサポートしていない可能性があります)、ARM7 のビルドを主張していることを示唆しています。
ツールチェーン 4.9 も試しましたが、結果は同じでした。
補足として: Ubuntu 14.04 に同梱されている arm-linux-gnueabi-g++ は (C++11 をサポートして) 動作することが知られていますが、使用するフォルダーにパックする方法が見つからないようです。譲渡可能なツールチェーンとして。
編集: old_timer の入力に従って、次のコマンドを使用して、コンパイルをオブジェクト ファイル (main.o) にリダイレクトしました。arm-linux-gnueabi-g++ -mcpu=arm10tdmi main.cpp -c
結果のオブジェクト ファイルで実行readelf -A
すると、次の出力が得られます。
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "ARM10TDMI"
Tag_CPU_arch: v5T
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-1
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_optimization_goals: Aggressive Debug
ただし、これを使用して実際の実行可能ファイルを作成しようとするとarm-linux-gnueabi-g++ -mcpu=arm10tdmi main.o -o test
、readelf の出力が、上に投稿した ARMv7 の出力に戻ります。
これは、コンパイラ自体が -mcpu スイッチを理解して使用することを示唆していますが、リンカーは次に進み、それを ARMv7 バイナリに変換します。