최근에 나는 arm 플랫폼을 위한 나만의 크로스 컴파일 툴체인을 만들려고 했습니다. GCC의 autoconf 스크립트를 사용하면 다음과 같은 변수를 전달해야 한다는 것을 알았습니다.
--with-cpu=cortex-m4 \
--with-fpu=fpv4-sp-d16 \
--with-float=hard \
--with-mode=thumb \
따라서 CPU, fpu 등을 구성해야 하기 때문에 ARM 플랫폼마다 다른 툴체인/컴파일러가 있어야 하는 것 같습니다. 그런데 이 툴체인에 일종의 미리 만들어진 바이너리가 있다는 것을 알게 되었습니다.
https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads
이 툴체인을 시도하고 hello world 프로그램을 컴파일한 후 대상 ARM 보드에서 시도했지만 "세그먼트 오류"가 표시되었습니다. 글쎄, 적어도 "바이너리 파일을 실행할 수 없습니다: Exec 형식 오류"는 아닙니다.
하지만 여전히 궁금합니다. 왜 작동하지 않나요? 아니면 실제로 작동해야 합니까?
답변1
툴체인 자체를 빌드할 때 지원하려는 기능을 구성해야 합니다. 원하는 대상에 필요한 기능만 지원하는 "얇은" 컴파일러를 구축할 수 있습니다.
그러나 ARM 플랫폼이 제공하는 모든 것을 지원하고 멍청한 컴파일러를 얻을 수도 있습니다.
기능 자체는 유형에 따라 달라야 합니다.
- 이와 같은 최적화 플래그
-mcpu
는 필요하지 않으며 단지 특정 ARM 프로세서에 대한 코드를 최적화하기 위한 것입니다. fpu
반면, FPU를 사용하려면 ARM 코어의 기능을 사용할 수 있어야 합니다.float=hard
프로세서가 아닌 OS에 따라 다릅니다. 부동 소수점 레지스터의 함수에 부동 소수점을 전달할 수 있으므로 ARM 레지스터와 부동 소수점 레지스터 간의 전송이 느리기 때문에 작업 속도가 상당히 빨라질 수 있습니다 . 하지만 링크의 경우 시스템이 이에 동의해야 합니다.- Thumb 지원도 어느 정도 선택 사항입니다. 코어가 지원하는 경우 둘 중 하나를 사용할 수 있지만 지금 당장 컴파일러가 썸 모드를 선택하지 못하게 하는 것은 어리석은 일입니다.