【发布时间】:2020-10-19 06:32:46
【问题描述】:
我正在尝试升级我的编译器以支持 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 的输出适用于旧的(工作)编译器:
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 输出返回到我在上面发布的 ARMv7 输出。
这表明编译器本身理解并使用 -mcpu 开关,但链接器随后继续将其转换为 ARMv7 二进制文件。
【问题讨论】:
-
您是否尝试过运行调试器?
-
@JHBonarius 不,还没有。只是可执行文件。嵌入式机器只有 gdbserver 可用,所以“本地调试”很困难。
-
如果你想使用 ubuntu 14.04 编译器,在 docker 中运行它可能是最简单的
-
@AlanBirtles 我最喜欢它,如果我有一个工具链文件夹,但如果一切都失败了,我当然会考虑你的建议。谢谢。
-
您做了某种形式的 make clean 来清理之前构建的所有对象,以便使用新的命令行选项构建它们?
标签: c++ c++11 arm toolchain linaro