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