다음 사양과 하드웨어 부동 소수점 연산 지원을 갖춘 임베디드 장치용 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
시도하는 것입니다.