Инструментальная цепочка Linaro не может создать двоичный файл ARMv5

Я пытаюсь обновить свой компилятор для поддержки С++ 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.


person Refugnic Eternium    schedule 19.10.2020    source источник
comment
Пробовали запускать отладчик?   -  person JHBonarius    schedule 19.10.2020
comment
@JHBonarius Нет, еще нет. Просто исполняемый файл. На встроенной машине доступен только gdbserver, поэтому «локальная отладка» затруднена.   -  person Refugnic Eternium    schedule 19.10.2020
comment
если вы хотите использовать компилятор Ubuntu 14.04, вероятно, проще всего запустить его в докере   -  person Alan Birtles    schedule 19.10.2020
comment
@AlanBirtles Мне бы хотелось, чтобы у меня была папка цепочки инструментов, но если все остальное не поможет, я обязательно рассмотрю ваше предложение. Спасибо.   -  person Refugnic Eternium    schedule 19.10.2020
comment
вы сделали какую-то форму make clean, чтобы очистить все объекты, созданные ранее, чтобы они были построены с новыми параметрами командной строки?   -  person old_timer    schedule 20.10.2020
comment
@old_timer Я признаю, что нет, однако «make» вообще не участвует в процессе. Промежуточных объектных файлов тоже нет. Есть только исходный файл и выходной файл «a.out». Однако удаление a.out до сборки не имеет значения.   -  person Refugnic Eternium    schedule 20.10.2020
comment
arm-linux-gnueabi-g++ -c -mcpu=arm10tdmi -o test.o -static-libstdc++ -std=gnu++11 main.cpp работает, поэтому, если ссылка не работает, возможно, проблема заключается в библиотеках, которые переопределяют объект ?   -  person old_timer    schedule 20.10.2020
comment
arm-linux-gnueabi-g++ -mcpu=arm10tdmi -save-temps -o test.elf -static-libstdc++ -std=gnu++11 main.cpp здесь то же самое main.o - это arm10tdmi, но на выходе - v7a. необходимо указать правильные файлы библиотеки.   -  person old_timer    schedule 20.10.2020
comment
@old_timer Рискуя показаться глупым, но... как бы я это сделал? Я как бы надеялся, что «загрузка набора инструментов Linaro и указание ему скомпилировать (и связать) двоичный файл ARM5» поможет.   -  person Refugnic Eternium    schedule 20.10.2020
comment
Если вы посмотрите на командную строку компоновщика из gcc arm-linux-gnueabi/libc/usr/lib/crt1.o, lib/gcc/arm-linux-gnueabi/5.5.0/crtbegin.o и т. д., все эти вещи созданы для v7a, и если вы разберете их, это thumb/thumb2, так что это не сработает. Я не понимаю, почему компоновщик не жаловался.   -  person old_timer    schedule 20.10.2020
comment
Я думаю, вам нужно строить из исходников для другой цели   -  person old_timer    schedule 20.10.2020
comment
@old_timer Ну, согласно документации на releases.linaro.org/components/ toolchain/binaries/5.1-2015.08 (поддерживаемые цели указаны как «цепочки инструментов для 32-разрядных ARMv7 (и более ранних версий) с прямым порядком байтов, программным плаванием и для систем GNU/Linux»). Это "и раньше" было бы очень мило...   -  person Refugnic Eternium    schedule 20.10.2020
comment
Я могу создавать инструменты для «голого железа», но не могу создавать полноценные бинарные инструменты для Linux. ни инструменты C++. в прошлом были бы вещи с несколькими библиотеками или разные пути для руки и большого пальца, например (разные файлы .a), но это не выскакивает на меня, это не значит, что их нет и раньше, а из того, что gcc передает компоновщику на моей машине все объекты armv7a связаны с объектом arm10tdmi, и по какой-то причине жалоб нет.   -  person old_timer    schedule 20.10.2020
comment
Разборка раздела .text: 000103e0 ‹_start›: 103e0: f04f 0b00 mov.w fp, #0 103e4: f04f 0e00 mov.w lr, #0   -  person old_timer    schedule 20.10.2020
comment
это из двоичного кода, который он построил, и это код thumb2, который никак не работает на arm10.   -  person old_timer    schedule 20.10.2020
comment
Если они подразумевают/претендуют на поддержку, вам нужно подать туда тикет и работать с ними. Это должно было быть то, с чего вы начали до ТАК...   -  person old_timer    schedule 20.10.2020
comment
Вы можете попробовать crosstool-ng или другие, если вы не хотите просто собирать из исходников напрямую самостоятельно. и посмотрите, что они предлагают, я выбираю целевую среду выполнения, а не время сборки (для инструментов gnu, для времени сборки clang/llvm) и не использую C или другие подобные библиотеки для «голого железа», поэтому прошло много лет с тех пор, как я пытался сделать что-то подобное, и самой большой проблемой для них были библиотеки для рук и большого пальца ... вам просто нужно исследовать это, я думаю, или отказаться от своего желания С++ 11 и вернуться к инструменту, который создает для цели.   -  person old_timer    schedule 20.10.2020
comment
@old_timer Да, понятно. Я только что подал заявку в службу поддержки группы Linaro, посмотрите, что они скажут (конечно, вы правы, я должен был это сделать, когда стало очевидно, что что-то работает не так, как должно). Не могли бы вы поместить свой совет в ответ, чтобы я мог его принять? Мне не нравятся вопросы без ответов, даже если мне не обязательно нравится то, что они подразумевают. :)   -  person Refugnic Eternium    schedule 20.10.2020


Ответы (1)


Престижность за этот ответ, чтобы пойти old_timer, который дал мне бесценный совет о том, куда идти.

Все, что мне пришлось сделать, это перейти на https://crosstool-ng.github.io , загрузите пакет, покопайтесь в зависимостях, а затем позвольте этому волшебству творить чудеса.

Я выбрал минимальную конфигурацию, версию компилятора 5.5.0 и, несмотря на мои опасения, что версия ядра 2.6.33.20 недоступна, бинарник просто работал после добавления целевой архитектуры в вызов командной строки.

person Refugnic Eternium    schedule 21.10.2020