이것은 RISC-V C 및 C ++ 크로스 컴필라입니다. 일반적인 ELF/Newlib 도구 체인과보다 정교한 Linux-ELF/GLIBC 도구 체인의 두 가지 빌드 모드를 지원합니다.
이 저장소는 하위 모듈을 사용하지만 하위 모듈은 주문시 자동으로 가져 오므로 --recursive
또는 git submodule update --init --recursive
필요하지 않습니다.
$ git clone https://github.com/riscv/riscv-gnu-toolchain
경고 : git 클론은 약 6.65GB의 디스크와 다운로드 크기가 필요합니다.
도구 체인을 구축하려면 몇 가지 표준 패키지가 필요합니다.
우분투에서 다음 명령을 실행하면 충분해야합니다.
$ sudo apt-get install autoconf automake autotools-dev curl python3 python3-pip libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev ninja-build git cmake libglib2.0-dev libslirp-dev
Fedora/Centos/Rhel OS에서 다음 명령을 실행하면 충분해야합니다.
$ sudo yum install autoconf automake python3 libmpc-devel mpfr-devel gmp-devel gawk bison flex texinfo patchutils gcc gcc-c++ zlib-devel expat-devel libslirp-devel
Arch Linux에서 다음 명령을 실행하면 충분합니다.
$ sudo pacman -Syyu autoconf automake curl python3 libmpc mpfr gmp gawk base-devel bison flex texinfo gperf libtool patchutils bc zlib expat libslirp
AUR : https://aur.archlinux.org/packages/riscv-gnu-toolchain-bin에서 아치 사용자가 사용할 수 있습니다
MacOS에서는 홈브류를 사용하여 종속성을 설치할 수 있습니다.
$ brew install python3 gawk gnu-sed make gmp mpfr libmpc isl zlib expat texinfo flock libslirp
이 readme에서 지침을 실행할 때는 새로 설치된 make
버전을 사용하는 대신 gmake
사용하십시오. MACOS에 GLIBC (LINUX)를 구축하려면 사례에 민감한 파일 시스템 내에서 빌드해야합니다. 가장 간단한 접근 방식은 케이스 민감한 형식으로 새 디스크 이미지를 생성하고 장착하는 것입니다. 마운트 포인트에 공백이 포함되어 있지 않은지 확인하십시오. 이것은 MacOS에 Newlib 또는 GCC 자체를 구축 할 필요가 없습니다.
이 프로세스는 약 200 MIB의 업스트림 소스를 다운로드하여 시작한 다음 툴체인을 패치, 빌드 및 설치합니다. 업스트림 소스의 로컬 캐시가 $ (distdir)에 존재하면 사용됩니다. 기본 위치는/var/cache/distfiles입니다. 프로세스를 완료하려면 컴퓨터가 약 8 gib의 디스크 공간이 필요합니다.
Newlib 크로스 컴파일러를 구축하려면 설치 경로를 선택하십시오 (이는 쓰기 가능). /opt/riscv
선택하면 /opt/riscv/bin
PATH
에 추가하십시오. 그런 다음 다음 명령을 실행합니다.
./configure --prefix=/opt/riscv
make
이제 RISCV64-unknown-elf-GCC와 그 사촌을 사용할 수 있어야합니다.
참고 : Newlib의 일부 (예 : libgloss-htif
)를 대체하는 외부 라이브러리를 사용하려는 경우 FAQ를 읽으십시오.
Linux 크로스 컴파일러를 구축하려면 설치 경로를 선택하십시오 (이는 쓰기 가능). /opt/riscv
선택하면 /opt/riscv/bin
PATH
에 추가하십시오. 그런 다음 다음 명령을 실행합니다.
./configure --prefix=/opt/riscv
make linux
빌드는 32 비트 빌드 환경에서도 GLIBC를 사용하여 RV64GC (64 비트)를 대상으로합니다. 32 비트 RV32GC 도구 체인을 구축하려면 다음을 사용하십시오.
./configure --prefix=/opt/riscv --with-arch=rv32gc --with-abi=ilp32d
make linux
glibc보다 무슬림 libc를 선호하는 경우 위와 같이 구성하고 make linux
대신 make musl
선택하십시오.
지원되는 아키텍처는 RV32I 또는 RV64I Plus 표준 확장 (a) Tomics, (M) Ultiplication and Division, (f) Loat, (d) Ouble 또는 (g) MAFD입니다.
지원되는 ABI는 ILP32 (32 비트 소프트 플로트), ILP32D (32 비트 하드 플로트), ILP32F (레지스터에서 단일-절약 및 메모리에서 두 배, 틈새 사용 만 사용), LP64 LP64F LP64D입니다 (동일하지만 동일하지만. 64 비트 길이와 포인터).
32 비트 및 64 비트를 모두 지원하는 크로스 컴파일러를 구축하려면 다음 명령을 실행하십시오.
./configure --prefix=/opt/riscv --enable-multilib
그런 다음 Linux, Linux Glibc 기반 또는 Linux Musl LIBC 기반 크로스 컴파일러를 위해 make linux
make
거나 make musl
십시오.
Multilib 컴파일러는 접두사 RISCV64-unknown-elf- 또는 RISCV64-unknown-Linux-GNU-를 갖지만 32 비트 및 64 비트 시스템을 모두 타겟팅 할 수 있습니다. 가장 일반적인 -march
/ -mabi
옵션을 지원하며 크로스 컴파일러에서 --print-multi-lib
플래그를 사용하여 볼 수 있습니다.
Linux Toolchain에는 기본적으로 비활성화되는 GCC의 기본 파이 활성화를 제어하기위한 추가 옵션 --enable-default-pie
있습니다.
활성화 된 언어를 사용자 정의하려면 사용 옵션 --with-languages=
. 예를 들어, c,c++,fortran
활성화하려면 ./configure --with-languages=c,c++,fortran
사용하려면. 이 옵션은 GNU 도구 체인에만 적용됩니다.
빈 디렉토리에 설치하면 가장 잘 작동합니다. 하드 플로트 툴체인을 빌드 한 다음 동일한 -Prefix 디렉토리를 사용하여 소프트 플로트 툴체인을 구축하려고하면 빌드 스크립트가 혼란스러워서 하드 플로트 코드를 연결할 수 없다고 불평하는 링커 오류로 종료 될 수 있습니다. 소프트 플로트 코드. 기존 도구 체인을 먼저 제거하거나 두 번째 빌드에 다른 접두사를 사용하면 문제가 발생하지 않습니다. 동일한 접두사를 사용하여 하나의 Newlib와 하나의 Linux 도구 체인을 구축해도됩니다. 그러나 동일한 접두사로 2 개의 Newlib 또는 2 개의 Linux 도구 체인을 구축하지 않아야합니다.
MacOS 시스템 또는 Linux 서브 시스템 또는 Cygwin을 사용하여 Windows 시스템에서 Linux 툴체인을 구축하는 경우 파일 시스템이 대소 문자를 사용하는지 확인해야합니다. *.OS 및 *.OS 파일이 빌드 중에 서로 충돌하여 결국 링크 오류가 혼란스러워지기 때문에 GLIBC를 구축 할 때 사례 감수성 파일 시스템을 구축하는 것이 실패합니다.
Centos (및 RHEL)는 RISC-V 툴체인을 구축하기에는 너무 오래된 오래된 GNU 도구 버전을 제공합니다. GNU 도구의 현재 버전을 포함하는 대체 도구 세트가 있습니다. 소프트웨어 컬렉션 서비스의 일부로 제공되는 DevToolset입니다. 자세한 내용은 DevToolset-7 URL을 참조하십시오. 사용 가능한 다양한 버전의 DevToolset가 있으므로 다른 버전을 사용해 볼 수도 있지만 DevToolset-7이 작동하는 한 가지 이상의 보고서가 있습니다.
구성을 위해 전달 될 수있는 여러 가지 추가 옵션이 있습니다. 자세한 내용은 './configure -help'를 참조하십시오.
또한 특정 프로젝트로 전달할 수있는 추가 플래그를 정의 할 수 있습니다. BINUTILS_NATIVE_FLAGS_EXTRA, BINUTILS_TARGET_FLAGS_EXTRA, GCC_EXTRA_CONFIGURE_FLAGS, GDB_NATIVE_FLAGS_EXTRA, GDB_TARGET_FLAGS_EXTRA, GLIBC_TARGET_FLAGS_EXTRA, NEWLIB_TARGET_FLAGS_EXTRA
. 예 : GCC_EXTRA_CONFIGURE_FLAGS=--with-gmp=/opt/gmp make linux
--with-isa-spec=
risc-v onpryileged (이전의 사용자 수준) ISA 사양의 기본 버전을 지정할 수 있습니다.
가능한 옵션은 다음과 같습니다. 2.2
, 20190608
및 20191213
.
기본 버전은 20191213
입니다.
이 옵션에 대한 자세한 내용은이 게시물 RISC-V GNU 툴체인 범프 기본 ISA 사양을 20191213으로 참조하십시오.
--with-multilib-generator=
구축 할 멀티 브를 지정할 수 있습니다. 인수는 반 값으로 구성된 세미콜론 분리 된 값 목록입니다. 현재 RISCV* - ELF 에 대해서만 지원됩니다. 허용되는 값과 의미는 다음과 같습니다.
모든 구성은 아키텍처 문자열, ABI, 아키텍처 문자열의 재사용 규칙 및 하위 확장과 함께 재사용 규칙의 네 가지 구성 요소로 구성됩니다.
부품 재사용 지원 확장 연산자 (*) 다양한 하위 확장의 조합을 단순화하기 위해 예제 4는 사용 및 작동 방식을 보여줍니다.
예 1 : ILP32를 사용하여 RV32I에 대한 다중 리브 지지대를 추가하십시오.
./configure --with-multilib-generator="rv32i-ilp32--"
예 2 : ILP32와 ILP32를 사용하여 RV32I에 대한 다중 리브 지지대를 추가하십시오.
./configure --with-multilib-generator="rv32i-ilp32--;rv32imafd-ilp32--"
예 3 : ILP32를 사용하여 RV32I에 대한 다중 리브 지지대 추가; ILP32를 사용한 RV32IM 및 ILP32의 RV32IC는이 멀티 리브 세트를 재사용합니다.
./configure --with-multilib-generator="rv32i-ilp32-rv32im-c"
예 4 : LP64를 사용하여 RV64IMA에 대한 다중 리브 지지대 추가; LP64를 갖는 RV64IMAF, LP64의 RV64IMAC 및 LP64가있는 RV64IMAFC는이 멀티 리브 세트를 재사용 할 것입니다.
./configure --with-multilib-generator="rv64ima-lp64--f*c"
Dejagnu Test Suite는 RISC-V에 포팅되었습니다. ELF 및 Linux 도구 체인의 시뮬레이터로 실행할 수 있습니다. 시뮬레이터는 makefile (예 : sim = qemu, sim = gdb 또는 --with-sim=
= spike)에서 SIM 변수에 의해 선택 될 수 있습니다. 첨가에서 시뮬레이터는 구성 시간 옵션을 사용하여 선택할 수도 있습니다. 그러나 TestSuite AllowList는 QEMU에 대해서만 민트로 표시되며 다른 시뮬레이터는 추가 실패를 얻을 수 있습니다.
테스트 환경을 설정하기위한 도우미 스크립트에는 pyelftools가 필요합니다.
최신 버전의 Ubuntu에서는 다음 명령을 실행하면 충분합니다.
$ sudo apt-get install python3-pyelftools
최신 버전의 Fedora 및 Centos/Rhel OS (9 이상)에서 다음 명령을 실행하면 충분해야합니다.
$ sudo yum install python3-pyelftools
Arch Linux에서 다음 명령을 실행하면 충분합니다.
$ sudo pacman -Syyu python-pyelftools
배포/OS에 pyelftools 패키지가없는 경우 PIP를 사용하여 설치할 수 있습니다.
# Assuming that PIP is installed
$ pip3 install --user pyelftools
GCC를 테스트하려면 다음 명령을 실행하십시오.
./configure --prefix=$RISCV --disable-linux --with-arch=rv64ima # or --with-arch=rv32ima
make newlib
make report-newlib SIM=gdb # Run with gdb simulator
./configure --prefix=$RISCV
make linux
make report-linux SIM=qemu # Run with qemu
./configure --prefix=$RISCV --with-sim=spike
make linux
make report # Run with spike
메모:
기본적으로 GCC는 회귀 테스트 스위트의 모든 테스트를 실행합니다. 병렬로 실행하는 동안 (예 : make -j$(nproc) report
는 다중 프로세서 시스템의 실행 시간을 상당히 높이면 모든 테스트를 실행하는 데 필요한 시간은 일반적으로 일반적인 개발주기에 너무 높습니다. 따라서 GCC를 사용하면 환경 변수 RUNTESTFLAGS
사용하여 실행되는 테스트를 선택할 수 있습니다.
테스트 실행을 RISC-V 특정 테스트 만 제한하려면 다음 명령을 사용할 수 있습니다.
runtestflags = "riscv.exp"보고서를 작성하십시오
"ZB*.C"및 "SM*.C"패턴과 일치하는 RISC-V 특정 테스트 만 테스트 실행을 제한하려면 다음 명령을 사용할 수 있습니다.
runtestflags = "riscv.exp = zb*.c sm*.c"보고서를 작성하십시오
도구 체인 테스트를 실행하기위한 기본 메이크 파일 대상은 report
입니다. 이것은 GCC 회귀 테스트 스위트의 모든 테스트를 실행합니다. 또는 다음 명령을 사용하여 다음을 수행 할 수 있습니다.
make check-gcc
다음 명령은 Binutils 테스트를 실행하는 데 사용될 수 있습니다.
make check-binutils
아래 명령은 GLIBC 테스트를 실행하는 데 사용될 수 있습니다.
make check-glibc-linux
--with-extra-multilib-test
Arch/ABI의 더 많은 rv64imac/lp64
을 테스트 할 rv64gc/lp64d
사용할 수 있습니다. rv64gcv/lp64d
또는 rv64gcv_zba/lp64d
, 그러면 -with-extra-multilib-test를 사용하여 --with-extra-multilib-test="rv64gcv-lp64d;rv64gcv_zba-lp64d"
를 지정할 수 있습니다. rv64gc/lp64d
, rv64imac/lp64
, rv64gcv/lp64d
및 rv64gcv_zba/lp64d
.
--with-extra-multilib-test
support Bare-Metal 및 Linux 툴체인 및 지원 Multilib조차 비활성화되지만 사용자는 추가 Multilib 테스트 구성이 기존 Lib/Multilib에서 작동 할 수 있도록해야합니다. Multilib에 RV32 Multilib가없는 경우.
--with-extra-multilib-test
또한 최종 사용자의 요구 사항에 맞는보다 복잡한 형식을 지원합니다. 우선, 인수는 테스트 구성 목록입니다. 각 테스트 구성은 분리됩니다 ;
. 예를 들어:
rv64gcv-lp64d;rv64_zvl256b_zvfh-lp64d
각 테스트 구성마다, 즉, 필요한 아치-아비 부품과 선택적 빌드 플래그가 있습니다. 우리는 레버리지 :
일부 제한 사항으로 그것들을 분리합니다.
:
분리하려면 사용할 수 있습니다. 예를 들어: rv64gcv-lp64d:--param=riscv-autovec-lmul=dynamic:--param=riscv-autovec-preference=fixed-vlmax
아래와 같은 하나의 대상 보드로 간주됩니다.
riscv-sim/-march=rv64gcv/-mabi=lp64d/-mcmodel=medlow/--param=riscv-autovec-lmul=dynamic/--param=riscv-autovec-preference=fixed-vlmax
rv64gcv-lp64d:--param=riscv-autovec-lmul=dynamic,--param=riscv-autovec-preference=fixed-vlmax
다음과 같은 두 개의 대상 보드로 간주됩니다.
riscv-sim/-march=rv64gcv/-mabi=lp64d/-mcmodel=medlow/--param=riscv-autovec-preference=fixed-vlmax
riscv-sim/-march=rv64gcv/-mabi=lp64d/-mcmodel=medlow/--param=riscv-autovec-lmul=dynamic
:
:) 또는 ( ,
) 연산자도 함께 활용할 수 있지만 OR ( ,
)는 항상 우선 순위가 높습니다. 예를 들어: rv64gcv-lp64d:--param=riscv-autovec-lmul=dynamic:--param=riscv-autovec-preference=fixed-vlmax,--param=riscv-autovec-lmul=m2
다음과 같은 견인 대상 멧돼지로 간주됩니다.
riscv-sim/-march=rv64gcv/-mabi=lp64d/-mcmodel=medlow/--param=riscv-autovec-lmul=dynamic/--param=riscv-autovec-preference=fixed-vlmax
riscv-sim/-march=rv64gcv/-mabi=lp64d/-mcmodel=medlow/--param=riscv-autovec-lmul=m2
LLVM은 RISC-V GNU 컴파일러 도구 체인과 함께 RISC-V 응용 프로그램을 구축 할 수 있습니다. C 및 C ++를 사용하여 LLVM을 구축하려면 구성 플래그 --enable-llvm
사용할 수 있습니다.
예를 들어 RV64 Linux 도구 체인 위에 LLVM을 구축하려면 다음 명령을 사용할 수 있습니다.
./configure ---prefix = $ riscv -enable-llvm-enable-linux make
--enable-llvm
과 multilib 구성 플래그의 조합은 지원되지 않습니다.
다음은 LLVM 지원으로 RV64GC Linux/Newlib 도구 체인을 구축하는 방법, Clang을 사용하여 C 및 C ++ 응용 프로그램을 구축하는 방법 및 QEMU를 사용하여 생성 된 이진을 실행하는 방법을 사용하는 방법입니다.
Linux 도구 체인 구축 및 실행 예제 :
# Build rv64gc toolchain with LLVM
./configure --prefix=$RISCV --enable-llvm --enable-linux --with-arch=rv64gc --with-abi=lp64d
make -j$(nproc) all build-sim SIM=qemu
# Build C application with clang
$RISCV/bin/clang -march=rv64imafdc -o hello_world hello_world.c
$RISCV/bin/qemu-riscv64 -L $RISCV/sysroot ./hello_world
# Build C++ application with clang
$RISCV/bin/clang++ -march=rv64imafdc -stdlib=libc++ -o hello_world_cpp hello_world_cpp.cxx
$RISCV/bin/qemu-riscv64 -L $RISCV/sysroot ./hello_world_cpp
Newlib 도구 체인 및 실행 예제를 구축합니다 ( --with-multilib-generator=
) :) :
# Build rv64gc bare-metal toolchain with LLVM
./configure --prefix=$RISCV --enable-llvm --disable-linux --with-arch=rv64gc --with-abi=lp64d
make -j$(nproc) all build-sim SIM=qemu
# Build C application with clang
$RISCV/bin/clang -march=rv64imafdc -o hello_world hello_world.c
$RISCV/bin/qemu-riscv64 -L $RISCV/sysroot ./hello_world
# Build C++ application with clang using static link
$RISCV/bin/clang++ -march=rv64imafdc -static -o hello_world_cpp hello_world_cpp.cxx
$RISCV/bin/qemu-riscv64 -L $RISCV/sysroot ./hello_world_cpp
이 섹션은 개발자 또는 고급 사용자만을위한 것이거나 자신의 소스 트리로 도구 체인을 만들고 자합니다.
riscv-gnu-toolchain
각 하위 모듈에 대한 안정이지만 최신 소스가 포함되어 있습니다. 최신 Develoment 트리를 사용하려면 다음 명령을 사용하여 모든 하위 모듈을 업그레이드 할 수 있습니다.
git submodule update --remote
또는 특정 하위 모듈 만 업그레이드 할 수 있습니다.
git submodule update --remote <component>
예를 들어, GCC 만 업그레이드하면 다음 명령을 사용할 수 있습니다.
git submodule update --remote gcc
분기 정보는 .gitmodules
파일로 기록되었으며,이 파일은 git submodule add -b
또는 git submodule set-branch
통해 설정하거나 업데이트 할 수 있습니다.
그러나 어떤 지점을 사용하고 있는지 확인하는 유일한 방법은 .gitmodules
파일을 확인하는 것입니다. gcc
의 예는 다음과 같습니다. 릴리스/GCC-12 지점을 사용하고 있으므로 gcc
라는 섹션이 있으며 Field branch
가 releases/gcc-12
가 있습니다. releases/gcc-12
.
[submodule "gcc"]
path = gcc
url = ../gcc.git
branch = releases/gcc-12
riscv-gnu-toolchain
이외의 소스 트리를 사용하십시오 riscv-gnu-toolchain
트리 외 소스를 사용하여 도구 체인을 구축하는 것을 지원합니다. 각 하위 모듈/구성 요소의 소스 트리를 지정하기위한 몇 가지 구성 옵션이 있습니다.
예를 들어, $HOME/gcc
에 GCC 소스가있는 경우 --with-gcc-src
사용하여 해당 소스를 사용하여 툴체인을 작성하십시오.
./configure ... --with-gcc-src=$HOME/gcc
다음은 다양한 하위 모듈/구성 요소에 대한 대체 소스를 지정하기위한 구성 옵션 목록입니다.
--with-binutils-src
--with-dejagnu-src
--with-gcc-src
--with-gdb-src
--with-glibc-src
--with-linux-headers-src
--with-llvm-src
--with-musl-src
--with-newlib-src
--with-pk-src
--with-qemu-src
--with-spike-src
--with-uclibc-src
GCC 기부금은 업스트림 포함에 대한 자격을 갖추려면 몇 가지 요구 사항을 충족해야합니다. 경고 무료 컴파일은 동일한 소스의 컴파일러 빌드를 사용하여 그 중 하나입니다. 플래그 --enable-host-gcc
다음과 같습니다.
-Werror
로 구축됩니다.Newlib의 일부가 외부 라이브러리 (예 : Berkeley Host-Target 인터페이스 용 Libgloss-Htif와 같은)로 대체되는 경우 Newlib와 외부 라이브러리가 동일한 코드 모델을 사용하여 구축되도록주의해야합니다. RISC-V 코드 모델에 대한 자세한 내용은이 Sifive 블로그 기사를 참조하십시오.
코드 모델 불일치를 나타내는 오류에는 "재배치 오버 플로우"또는 "재배치 자르기"오류가 실행 파일에서 기호를 성공적으로 재배치 할 수없는 오류가 포함됩니다.
기본적으로 riscv-gnu-toolchain
-mcmodel=medlow
사용하여 Newlib을 만듭니다. 대체 medany
코드 모델 (libgloss-htif에서 사용되는)을 사용하여 --with-cmodel=medany
구성 스크립트로 전달하여 사용할 수 있습니다.