Linaro 工具链无法创建 ARMv5 二进制文件

Linaro toolchain fails to create ARMv5 binary

我正在尝试升级我的编译器以支持 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.

文件命令 运行 在相同的源上,但使用旧的 (Pre-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 的输出对于旧的(工作中的)编译器产生:

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 的输入,我使用命令 arm-linux-gnueabi-g++ -mcpu=arm10tdmi main.cpp -c

将编译重定向到目标文件 (main.o)

运行 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 输出 returns 到我上面发布的 ARMv7 输出。

这表明,编译器本身理解并使用 -mcpu 开关,但链接器随后继续并将其转换为 ARMv7 二进制文件。

感谢这个回答 old_timer,他给了我宝贵的提示。

我最后要做的就是转至 https://crosstool-ng.github.io,下载软件包,翻找依赖项,然后让它发挥作用。

我选择了最小配置,编译器版本 5.5.0,尽管我担心内核版本 2.6.33.20 不可用,但二进制文件在将目标体系结构添加到命令行调用后就可以正常工作了。