하드웨어 부동 소수점 연산을 지원하는 ARM926EJ-s 장치의 크로스 컴파일

하드웨어 부동 소수점 연산을 지원하는 ARM926EJ-s 장치의 크로스 컴파일

다음 사양과 하드웨어 부동 소수점 연산 지원을 갖춘 임베디드 장치용 C++ 코드를 크로스 컴파일해야 합니다. 하드웨어 부동 소수점 지원 없이 Ubuntu 20.04에서 크로스 컴파일하는 것은 쉽습니다. 실행할 수 있고 arm-linux-gnueabi-g++ -marm -mcpu=arm926ej-s -mfloat-abi=soft -mfpu=vfp작동할 것입니다. 나와 함께 달리면 -mfloat-abi=hard다음을 얻을 수 있습니다.

/usr/lib/gcc-cross/arm-linux-gnueabi/9/../../../../arm-linux-gnueabi/bin/ld: error: ArmSimulateStartStop uses VFP register arguments, /usr/lib/gcc-cross/arm-linux-gnueabi/9/crtbegin.o does not
/usr/lib/gcc-cross/arm-linux-gnueabi/9/../../../../arm-linux-gnueabi/bin/ld: failed to merge target specific data of file /usr/lib/gcc-cross/arm-linux-gnueabi/9/crtbegin.o
/usr/lib/gcc-cross/arm-linux-gnueabi/9/../../../../arm-linux-gnueabi/bin/ld: error: ArmSimulateStartStop uses VFP register arguments, /usr/lib/gcc-cross/arm-linux-gnueabi/9/crtend.o does not
/usr/lib/gcc-cross/arm-linux-gnueabi/9/../../../../arm-linux-gnueabi/bin/ld: failed to merge target specific data of file /usr/lib/gcc-cross/arm-linux-gnueabi/9/crtend.o
collect2: error: ld returned 1 exit status
make: *** [Makefile:12: CrossCompile] Error 1

나는 이 프로세서가 하드웨어 부동 소수점 지원을 지원한다는 것을 알고 있습니다.팔 문서. 다운로드했습니다루트 디렉터리 구축그리고크로스 도구하지만 내 장치 하드웨어에 맞게 구성하는 방법을 모르겠습니다. 크로스 컴파일에 VFP 지원을 사용하는 방법은 무엇입니까?

장비 사양:

~ $ cat /proc/cpuinfo 
Processor       : ARM926EJ-S rev 5 (v5l) 
BogoMIPS        : 197.83 
Features        : swp half thumb fastmult edsp java 
CPU implementer : 0x41 
CPU architecture: 5TEJ 
CPU variant     : 0x0 
CPU part        : 0x926 
CPU revision    : 5

~ $ cat /proc/version 
Linux version 2.6.36 (owzafs@PCOWZAFS) (gcc version 4.4.1 (Sourcery G++ Lite 2010q1-202) ) #464 PREEMPT Thu Apr 19 13:50:56 CEST 2018 

편집하다: 에 따르면걸프 협력 협의회 문서: VFP 보조 프로세서와 함께 -mfloat-abi=hard를 사용하는 것은 지원되지 않습니다. 적절한 -mfpu 옵션과 함께 -mfloat-abi=softfp를 사용하면 컴파일러가 이러한 CPU의 하드웨어 부동 소수점 기능을 활용하는 코드를 생성할 수 있습니다.

mfloat-abi=softfp그러나 내가 얻은 장치에서 바이너리를 실행할 때 코드를 사용 하고 컴파일했습니다 Illegal instruction.

답변1

개체처럼 보이고 crtbegin.o메인 crtend.o라인 빌드와 일치하지 않습니다.

제 생각에 가장 좋은 방법은 다시 컴파일하고 crtbegin.s, crtend.s동일한 설정으로 다시 컴파일하고 -mfloat-abi=hard, 별도로 만들고 crtbegin.o다시 crtend.o시도하는 것입니다.

관련 정보