问题描述
我正在尝试升级我的编译器以支持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命令在相同的源上运行,但使用旧的(Pre-C ++ 11)编译器编译,结果为:test: ELF 32-bit LSB executable,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
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二进制文件。
解决方法
对于这个答案,old_timer表示敬意,他给了我关于去哪里的宝贵提示。
我最后要做的就是简单地浏览https://crosstool-ng.github.io,下载软件包,浏览依赖项,然后让事情做起来很神奇。
我选择了最低配置,即编译器版本5.5.0,尽管我担心内核版本2.6.33.20不可用,但是在将目标体系结构添加到命令行调用之后,二进制文件只是工作了。