Сборка GCC как кросс-компилятора ARM с поддержкой нескольких библиотек

Я хочу собрать GCC из исходного кода в качестве кросс-компилятора для целей ARM без операционной системы. В частности, мне нужна поддержка архитектур armv4t и armv5te с softfp для обеих из них, поскольку у них нет надлежащего FPU.

(Соответствующие) флаги, которые я использовал,

--with-cpu=arm946e-s --with-mode=arm --with-float=soft --enable-interwork --enable-multilib --with-multilib-list=armv4t,armv5te

Таким образом я пытался добиться того, чтобы компилятор по умолчанию использовал armv5te с параметром --with-cpu и по-прежнему сохранял возможность сборки для armv4t.

Сборка Binutils работала нормально, однако при сборке подкаталога gcc gcc проверка мультибиблиотеки не удалась:

For arm946e-s real value is arm946e-s
Error: --with-multilib-list=armv4t,armv5te not supported.
make: *** [Makefile:4356: configure-gcc] Error 1

Я искал, как включить поддержку armv5te, поскольку armv4t с arm7tdmi кажется целью мультибиблиотеки по умолчанию, но не нашел результатов. Кажется, даже не существует правильного списка допустимых мультибиблиотечных целей. Удаление списка мультибиблиотек дало сборку мультибиблиотек armv4t и armv7-a, которые мне не нужно поддерживать.

Как я могу успешно построить обе цели с помощью softfp?


person Overblade    schedule 23.07.2020    source источник
comment
gcc.gnu.org/install/configure.html --with-multilib-list= принимает только rmprofile или/и aprofile, больше ничего   -  person KamilCuk    schedule 23.07.2020
comment
armv5te не является архитектурой серии Cortex, поэтому ни один профиль не решит проблему.   -  person Overblade    schedule 23.07.2020


Ответы (1)


ТЛ-ДР; Нет нужды. Используйте обертку и ссылку на нужные стандартные библиотеки.

Для мягкого и жесткого плавания действуют как библиотеки gcc, так и сгенерированный код. Для системы с armv4 и armv5 один и тот же компилятор всегда сможет сгенерировать один и тот же код. Более того, сгенерированные объекты являются одним и тем же ABI. Т.е. они передают параметры, используя один и тот же механизм. Таким образом, инструкция ассемблера внутри объекта может быть нацелена на armv4 или armv5. Если вы используете архитектуру armv5, вы можете даже связать и запустить объекты armv4. Нет проблем, за исключением того, что код неоптимален.

Вы можете собрать библиотеки gcc дважды с параметрами armv4 и armv5. Сохраните созданные библиотеки. Заголовки будут идентичными. При сборке armv5 используйте библиотеки armv5. Используйте -mcpu, -isystem (если хотите) и -L, чтобы получить оптимизированные для armv5 библиотеки. По этой причине я бы использовал сборку armv4 как по умолчанию. Наверняка это можно сделать с помощью -freestanding и скрипта-оболочки gcc-armv5.


Конфигурация multilib отличается тем, что фактический двоичный файл компилятора может генерировать два набора пролога и эпилога. Даже до появления multilib всегда можно было сгенерировать код для armv4 или armv5, используя один и тот же компилятор с -mcpu или -march и -mtune. Просто у них были одинаковые пролог и эпилог. Бэкенд генерации инструкций в gcc всегда был multicpu. Вероятно, multilib лучше было бы назвать multiab.

person artless noise    schedule 26.07.2020