Я пытаюсь обновить свой компилятор для поддержки С++ 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, 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, но с теми же результатами.
В качестве примечания: известно, что arm-linux-gnueabi-g++, поставляемый с Ubuntu 14.04, работает (с поддержкой 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.