мое приложение использует оба кода: thumb и vfp, но я никогда специально
установить флаг -thumb-interwork .. как это возможно?
Согласно справочной странице, без этого флажка наборы двух команд
нельзя надежно использовать внутри одной программы.
Это говорит "надежно"; поэтому без этой опции кажется, что они все еще могут быть смешаны в одной программе, но это может быть «ненадежно». Я думаю, что обычно смешивание обоих наборов инструкций работает, компилятор достаточно умен, чтобы понять, когда ему нужно переключиться с одного набора на другой. Однако могут быть пограничные случаи компилятор просто не понимает правильно, и он может не увидеть , что он должен переключать наборы команд здесь, вызывая сбой приложения (скорее всего, это потерпит крах). Эта опция генерирует специальный код, так что независимо от того, что делает ваш код, переключение всегда происходит правильно и надежно; недостатком является то, что этот дополнительный код необходим для каждой глобальной видимой функции и, следовательно, увеличивает двоичную сторону (я понятия не имею, может ли он также немного замедлить вызовы функций, лично я ожидал бы этого).
Обратите также внимание на следующие две настройки:
-mcallee-супер-межсетевого
Предоставляет все внешне видимые функции в файле, являющемся
скомпилировал заголовок набора команд ARM
который переключается в режим большого пальца перед выполнением остальных
функция. Это позволяет этим
функции, вызываемые из не взаимодействующего кода.
-mcaller-супер-межсетевой
Позволяет звонки через указатели функций (включая виртуальные
функции) правильно выполнять независимо
о том, был ли целевой код скомпилирован для
Взаимодействует или нет. Есть небольшие накладные расходы
в стоимости выполнения указателя на функцию, если эта опция
включен.
Хотя я думаю, что они нужны вам только при создании библиотек для использования с другими проектами; но я не знаю точно. Обработка большого пальца в GCC определенно "недокументирована".