Добавление нескольких цепочек инструментов ARM в путь - PullRequest
0 голосов
/ 15 февраля 2020

Итак, я собираюсь скомпилировать 32-битную версию armv2 на моем Ma c таким образом, чтобы он не использовал регистр FP, который, как мне сказали, не был в более ранних версиях arm 32 моим инструктором.

Я думаю, что если бы я использовал более раннюю версию набора инструментов, он мог бы поддерживать armv2, поэтому, в то время как я в настоящее время добавил g cc -arm-none-eabi-9-2019-q4-major к пути, я мог бы также добавить g cc -arm-none-eabi-8-2018-q4-major to path.

Вот в чем проблема, у них обоих двоичный файл arm-none-eabi-g cc, и это то, что я хочу использовать, и если я добавлю оба к своему пути ... Я не уверен, как указать, использовать ли версию g cc 2019-q4 или 2018-q4. Любые хорошие идеи о том, как это настроить?

Также в качестве бонуса, если кто-нибудь знает, как принудительно скомпилировать как armv2, это было бы также полезно, так что я могу видеть, если более ранние версии не использовали fp. Thankyou!

1 Ответ

1 голос
/ 15 февраля 2020

ваши инструменты расскажут вам все, что вам нужно знать, не нужно использовать SO.

arm-none-eabi-gcc --version
arm-none-eabi-gcc (GCC) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

arm-none-eabi-gcc -O2 -c -march=armv2a so.c -o so.o
arm-none-eabi-gcc: error: unrecognized -march target: armv2a
arm-none-eabi-gcc: note: valid arguments are: armv4 armv4t armv5t armv5te armv5tej armv6 armv6j armv6k armv6z armv6kz armv6zk armv6t2 armv6-m armv6s-m armv7 armv7-a armv7ve armv7-r armv7-m armv7e-m armv8-a armv8.1-a armv8.2-a armv8.3-a armv8.4-a armv8.5-a armv8-m.base armv8-m.main armv8-r iwmmxt iwmmxt2; did you mean ‘armv4’?
arm-none-eabi-gcc --version
arm-none-eabi-gcc (GCC) 5.4.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

arm-none-eabi-gcc -c -march=armvxx so.c -o so.o
arm-none-eabi-gcc: error: unrecognized argument in option ‘-march=armvxx’
arm-none-eabi-gcc: note: valid arguments to ‘-march=’ are: armv2 armv2a armv3 armv3m armv4 armv4t armv5 armv5e armv5t armv5te armv6 armv6-m armv6j armv6k armv6s-m armv6t2 armv6z armv6zk armv7 armv7-a armv7-m armv7-r armv7e-m armv7ve armv8-a armv8-a+crc iwmmxt iwmmxt2 native

, поэтому где-то между 5.4.0 и 9.2.0 g cc упала поддержка armv2 Я подозреваю, что это был 6.xx, но заметки о выпуске от g cc - это то, где искать.

google

gcc no frame pointer

, и вы найдете

-fomit-frame-pointer
-fno-omit-frame-pointer

test it

unsigned int test ( unsigned int a, unsigned int b )
{
    return(a+b);
}

arm-none-eabi-g cc -S -march = armv2 так. c

@ Function supports interworking.
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 1, uses_anonymous_args = 0
@ link register save eliminated.
str fp, [sp, #-4]!

теперь это создает непригодный код, потому что он использует bx lr, так что возможно g cc 5.xx тоже не годится. но чтобы продолжить

arm-none-eabi-gcc -fomit-frame-pointer -S -march=armv2 so.c

test:
    @ Function supports interworking.
    @ args = 0, pretend = 0, frame = 8
    @ frame_needed = 0, uses_anonymous_args = 0
    @ link register save eliminated.
    sub sp, sp, #8
    str r0, [sp, #4]

, вы можете попробовать это для armv4 и более поздних версий. g cc 5.xx по умолчанию использует указатель кадра

9.2.0 также использует кадр указатель по умолчанию, но опция -fomit-frame-pointer также работает

(я намеренно не оптимизировал, так как это не использовало бы стек, пришлось бы создавать другую тестовую функцию, которая заставляла бы использовать стек и стремление к кадру).

unsigned int another_test ( unsigned int );
unsigned int test ( unsigned int a, unsigned int b )
{
    return(another_test(a)<<b);
}

arm-none-eabi-gcc -O2 -S -march=armv7-a so.c

test:
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed = 0, uses_anonymous_args = 0
    push    {r4, lr}

arm-none-eabi-gcc -fno-omit-frame-pointer -O2 -S -march=armv7-a so.c

test:
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed = 1, uses_anonymous_args = 0
    push    {r4, r5, fp, lr}
    add fp, sp, #12

те же / аналогичные результаты с оптимизацией и более старой версией g cc, где было определено, что рамка не нужна, и по умолчанию она не используется, но если вы ее принудили было бы.

...