Строго говоря, все эти ответы кажутся мне неправильными.
Когда я компилирую код C с помощью моей перекрестной цепочки инструментов, компоновщик печатает страницы с предупреждениями о том, что мой исполняемый файл использует жесткие числа, а мой libc использует мягкие числа. Какая разница?
Debian VFP wiki содержит информацию о трех вариантах выбора -mfloat-abi
,
soft
- это чистое программное обеспечение
softfp
- это поддерживает аппаратный FPU, но ABI программно совместим.
hard
- ABI использует float или VFP регистров.
Ошибка компоновщика (загрузчика) из-за того, что у вас есть общая библиотека, которая будет передавать значения с плавающей запятой в целочисленных регистрах. Вы по-прежнему можете скомпилировать свой код с помощью -mfpu=vfp
и т. Д., Но вы должны использовать -mfloat-abi=softfp
, чтобы, если libc нужен float, он передавался так, как понимает библиотека.
Ядро Linux может поддерживать эмуляцию инструкций VFP. Очевидно, что для этого лучше компилировать с -mfpu=none
, и компиляция должна генерировать код напрямую, а не полагаться на эмуляцию ядра Linux. Однако я не верю, что ошибка ОП на самом деле связана с этой проблемой. Он является отдельным и должен также рассматриваться вместе с -mfloat-abi
.
Общая библиотека Armv5 с процессором ArmV7 противоположна этой; libc был жестким, но приложение было только soft . У него есть несколько способов обойти эту проблему, но перекомпиляция с правильными параметрами всегда проще всего.
Другая проблема заключается в том, что ядро Linux должно поддерживать задачи VFP (или любую другую с плавающей точкой ARM) для сохранения / восстановления регистров при переключении контекста.