이 저장소에는 다음을 기반으로 Arm을 대상으로 하는 베어 메탈 LLVM 기반 도구 체인을 구축하기 위한 빌드 스크립트와 보조 자료가 포함되어 있습니다.
목표는 Armv6-M 이상의 Arm 아키텍처 제품군을 대상으로 할 수 있는 LLVM 기반 베어메탈 툴체인을 제공하는 것입니다. 툴체인은 Arm 아키텍처용 ABI를 따르며 임베디드 및 실시간 운영 체제에 필요한 일반적인 기능을 제공하려고 시도합니다.
C++는 LLVM의 libc++ 및 libc++abi를 사용하여 부분적으로 지원됩니다. 지원되지 않는 기능은 다음과 같습니다.
Arm용 LLVM 임베디드 툴체인은 불안정한 libc++ ABI 버전을 사용합니다. 이 ABI는 최신 libc++ 개선 사항과 버그 수정을 모두 사용하지만 이전 버전의 ABI에 대해 컴파일된 객체에 대해 링크할 때 링크 오류가 발생할 수 있습니다. 자세한 내용은 https://libcxx.llvm.org/DesignDocs/ABIVersioning.html을 참조하세요.
Arm용 LLVM 임베디드 툴체인은 다음 업스트림 구성요소를 사용합니다.
요소 | 링크 |
---|---|
LLVM | https://github.com/llvm/llvm-project |
피콜리백 | https://github.com/picolibc/picolibc |
이 저장소의 콘텐츠는 Apache-2.0에 따라 라이센스가 부여됩니다. LICENSE.txt를 참조하세요.
결과 바이너리는 해당 오픈 소스 라이선스에 따라 보호됩니다. 위의 구성 요소 링크를 참조하세요.
일부 대상에 대한 테스트에서는 무료로 사용할 수 있지만 자체 라이선스가 있는 오픈 소스 Arm FVP 모델은 사용하지 않습니다. 이는 기본적으로 사용되지 않습니다. 자세한 내용은 소스에서 빌드를 참조하세요.
Arm용 LLVM 임베디드 툴체인은 Ubuntu 18.04 LTS에서 구축 및 테스트되었습니다.
Windows 버전은 Windows Server 2019를 기반으로 구축되었으며 Windows 10에서 가볍게 테스트되었습니다.
macOS에서의 빌드는 x86_64 및 Apple Silicon에서 작동합니다.
Linux 및 Windows용 주요 LLVM 릴리스에 대해 바이너리 패키지가 제공됩니다.
Github 릴리스에서 플랫폼용 도구 체인 릴리스를 다운로드하고 아카이브를 임의의 디렉터리에 추출합니다.
Microsoft Visual C++ 재배포 가능 최신 지원 다운로드와 같은 적절한 최신 지원 Microsoft Visual C++ 재배포 가능 패키지를 설치합니다.
참고: 신뢰할 수 없는 입력이 포함된 공유 환경에서 툴체인을 사용하는 경우 샌드박스가 충분히 처리되었는지 확인하세요.
툴체인을 사용하려면 명령줄에서 다음 옵션을 제공해야 합니다.
crt0
또는 crt0-semihost
. crt0
자동으로 연결되지만 crt0-semihost
사용할 수 있도록 -nostartfiles
옵션을 사용하여 이를 억제할 수 있습니다.crt0-semihost
사용하는 경우 세미호스팅 라이브러리.-T
로 지정된 링커 스크립트입니다. 기본 picolibcpp.ld
및 picolibc.ld
스크립트가 제공되며 직접 사용하거나 사용자 정의 링커 스크립트에서 포함할 수 있습니다.예를 들어:
$ PATH=/LLVMEmbeddedToolchainForArm-/bin:$PATH
$ clang
--target=armv6m-none-eabi
-mfpu=none
-fno-exceptions
-fno-rtti
-nostartfiles
-lcrt0-semihost
-lsemihost
-T picolibc.ld
-o example example.c
clang
의 multilib 시스템은 컴파일 플래그를 기반으로 적절한 라이브러리 세트를 자동으로 선택합니다. clang
적절한 라이브러리 세트를 찾을 수 없으면 경고를 표시합니다.
multilib 시스템에서 선택한 디렉토리를 표시하려면 clang
명령줄 옵션에 -print-multi-directory
플래그를 추가하세요.
사용 가능한 모든 multilib를 표시하려면 -print-multi-lib
플래그와 --target=aarch64-none-elf
또는 --target=arm-none-eabi
와 같은 타겟 트리플을 사용하여 clang
실행하세요.
clang
당신이 사용하고 싶지 않은 라이브러리 세트를 선택할 수도 있습니다. 이 경우 사용하려는 라이브러리의 include
및 lib
디렉터리가 포함된 디렉터리를 지정하는 --sysroot
옵션을 제공하여 multilib 시스템을 우회할 수 있습니다. 예를 들어:
$ clang
--sysroot=/LLVMEmbeddedToolchainForArm-/lib/clang-runtimes/arm-none-eabi/armv6m_soft_nofp
--target=armv6m-none-eabi
-mfpu=none
-fno-exceptions
-fno-rtti
-nostartfiles
-lcrt0-semihost
-lsemihost
-T picolibc.ld
-o example example.c
FPU 선택을 건너뛸 수 있지만 기본값이 GCC와 다르기 때문에 권장되지 않습니다.
툴체인 빌드는 Omax.cfg 및 OmaxLTO.cfg라는 두 개의 구성 파일과 함께 패키지로 제공됩니다. 이러한 구성 파일을 사용하면 여러 빌드 최적화 플래그를 활성화하여 일반적인 임베디드 벤치마크에서 최고의 성능을 달성할 수 있습니다. OmaxLTO.cfg는 LTO(링크 시간 최적화) 특정 플래그를 활성화합니다. 이러한 구성은 --config
플래그를 사용하여 선택적으로 전달할 수 있습니다. 예를 들어:
$ clang
example.c
...
--config=Omax.cfg
--config=OmaxLTO.cfg
-o example
Omax.cfg는 IEEE 규정을 위반하고 코드 정확성에 영향을 미칠 수 있는 수학 최적화를 가능하게 하는 -ffast-math
활성화한다는 점을 사용자에게 경고해야 합니다. LTO는 링크 시간의 잠재적 증가 및/또는 링크 중 메모리 사용량 증가로 인해 사용자가 LTO를 원하지 않을 수 있으므로 OmaxLTO.cfg에 별도로 보관됩니다. 구성 파일의 일부 옵션은 문서화되지 않은 내부 LLVM 옵션입니다. 이러한 문서화되지 않은 옵션에 대한 자세한 내용은 LLVM 프로젝트의 해당 최적화 패스 소스 코드를 참조하세요. 또한 사용자는 자신만의 구성을 만들고 플래그 매개변수를 조정하는 것이 좋습니다. Arm 특정 최적화 플래그에 대한 LLVM 임베디드 툴체인에 대한 정보는 최적화 플래그에서 확인할 수 있습니다.
Arm용 LLVM 임베디드 툴체인의 바이너리 릴리스는 업스트림 LLVM 프로젝트의 릴리스 분기를 기반으로 하므로 일치하는 버전의 LLVM 릴리스에서 제공하는 모든 도구와 함께 안전하게 사용할 수 있습니다.
Arm GNU 도구 체인을 사용하는 기존 프로젝트에서 Arm용 LLVM 임베디드 도구 체인을 사용하는 방법에 대한 조언은 Arm GNU 도구 체인에서 마이그레이션 및 실험적 newlib 지원을 참조하세요.
참고:
picolibc
Arm GNU 툴체인에 대한 탁월한 지원을 제공하므로 Arm GNU 툴체인과 Arm용 LLVM 임베디드 툴체인을 모두 사용해야 하는 프로젝트에서는picolibc
또는newlib
선택할 수 있습니다.
Arm용 LLVM 임베디드 툴체인은 오픈 소스 프로젝트이므로 소스에서 빌드할 수 있습니다. 자세한 지침은 소스에서 빌드 가이드를 참조하세요.
Github 이슈를 통해 이슈를 제기해주세요.
자세한 내용은 기여 가이드를 참조하세요.