크로스 툴체인으로 C 코드를 컴파일하면 링커는 실행 파일이 하드 플로트를 사용하지만 libc는 소프트 플로트를 사용한다는 경고 페이지를 인쇄합니다. 차이점이 뭐야?
답변:
하드 플로트는 온칩 부동 소수점 단위를 사용합니다. 소프트 플로트는 소프트웨어에서 하나를 에뮬레이트합니다. 차이점은 속도입니다. 칩에 FPU가 있거나없는 것이기 때문에 동일한 타겟 아키텍처에서 둘 다 사용되는 것을 보는 것은 이상합니다. -msoft-float를 사용하여 GCC에서 소프트 부동 소수점을 활성화 할 수 있습니다. libc를 사용하는 경우 하드웨어 부동 소수점을 사용하도록 libc를 다시 컴파일 할 수 있습니다.
엄밀히 말해서,이 모든 대답은 나에게 잘못된 것 같습니다.
크로스 툴체인으로 C 코드를 컴파일하면 링커는 실행 파일이 하드 플로트를 사용하지만 libc는 소프트 플로트를 사용한다는 경고 페이지를 인쇄합니다. 차이점이 뭐야?
데비안 위키 VFP 에 대한 세 가지 선택에 대한 정보를 가지고 -mfloat-abi
,
soft
-이것은 순수한 소프트웨어입니다softfp
-하드웨어 FPU를 지원하지만 ABI 는 소프트 호환됩니다.hard
-ABI는 부동 또는 VFP 레지스터를 사용합니다.링커 (로더) 오류는 정수 레지스터에 부동 소수점 값을 전달하는 공유 라이브러리가 있기 때문입니다. -mfpu=vfp
, 등으로 코드를 컴파일 할 수 있지만 libc 에 float가 필요한 -mfloat-abi=softfp
경우 라이브러리가 이해하는 방식으로 전달 되도록 사용해야합니다 .
Linux 커널은 VFP 명령어의 에뮬레이션을 지원할 수 있습니다. 분명히이 -mfpu=none
경우에는 컴파일하는 것이 더 좋으며 Linux 커널 에뮬레이션에 의존하는 대신 컴파일이 코드를 직접 생성하도록합니다. 그러나 OP의 오류가 실제로이 문제와 관련이 있다고 생각하지 않습니다. 그것은 분리되어 있으며 또한 -mfloat-abi
.
ArmV7 CPU 가있는 Armv5 공유 라이브러리는 이와 반대입니다. 의 libc는 하드 플로트했지만 응용 프로그램은이었다 소프트 . 문제를 해결할 수있는 몇 가지 방법이 있지만 올바른 옵션으로 다시 컴파일하는 것이 항상 가장 쉽습니다.
또 다른 문제는 Linux 커널이 컨텍스트 스위치에서 레지스터를 저장 / 복원하기 위해 VFP 작업 (또는 ARM 부동 소수점이있는 모든 것)을 지원해야한다는 것입니다.
libc가 소프트웨어 부동 소수점 연산을 위해 만들어진 것처럼 들리지만 exe는 부동 소수점에 대한 하드웨어 지원을 가정하여 컴파일되었습니다. 단기적으로는 컴파일러 플래그로 소프트 플로트를 강제 할 수 있습니다. (gcc를 사용하는 경우 -msoft-float라고 생각합니다)
장기적으로 타겟의 프로세서가 부동 소수점 연산에 대한 하드웨어 지원을 가지고 있다면 일반적으로 속도를 위해 하드웨어 부동이 활성화 된 크로스 툴체인을 구축하거나 찾고 싶을 것입니다. 일부 프로세서 제품군에는 하드웨어 지원이있는 모델과없는 모델이 있습니다. 예를 들어, 프로세서가 ARM이라고 말하는 것만으로는 하드웨어 부동 소수점 지원 여부를 알 수 없습니다.
계산은 부동 소수점 하드웨어 또는 정수 산술을 기반으로하는 소프트웨어에서 수행 할 수 있습니다.
하드웨어에서 수행하는 것이 훨씬 빠르지 만 많은 마이크로 컨트롤러에는 부동 소수점 하드웨어가 없습니다. 이 경우 부동 소수점 (일반적으로 최상의 옵션) 사용을 피하거나 C 라이브러리의 일부가 될 소프트웨어 구현에 의존 할 수 있습니다.
ARM과 같은 일부 컨트롤러 제품군에서는 부동 소수점 하드웨어가 제품군의 일부 모델에 있지만 다른 제품군에는 존재하지 않으므로 이러한 제품군에 대한 gcc는 둘 다 지원합니다. 귀하의 문제는 두 가지 옵션을 혼합 한 것 같습니다.