Изграждане на GCC като ARM крос компилатор с поддръжка на multilib

Искам да създам 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 проверката на multilib се провали с:

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)


TL-DR; Няма нужда. Използвайте обвивка и свържете към желаните стандартни библиотеки.

За soft и hard float се влияят както 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 би било по-добре да се нарича multiabi.

person artless noise    schedule 26.07.2020