0

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 バイナリに変換します。

4

1 に答える 1