RISC-V toolchain 빌드

RISC-V는 오픈소스 명령어 집합 아키텍처(ISA)로, 임베디드 시스템부터 고성능 컴퓨팅까지 다양한 용도로 사용된다. RISC-V 개발 환경을 구축하려면 GCC 기반의 RISC-V Toolchain을 빌드해야 한다. 이 글에서는 RISC-V Toolchain을 빌드하는 방법에 대해 알아본다.


RISC-V Toolchain이란?

RISC-V Toolchain은 RISC-V 아키텍처에서 실행 가능한 프로그램을 개발하기 위해 필요한 도구 모음이다.

주요 구성 요소

  • GCC (GNU Compiler Collection): RISC-V 코드를 컴파일
  • Binutils: 어셈블러 및 링커를 제공
  • GDB (GNU Debugger): 디버깅 도구
  • Newlib: 경량 C 라이브러리로, 임베디드 환경에서 주로 사용
  • GLIBC: 완전한 기능을 갖춘 GNU C 라이브러리

주요 용도

  1. RISC-V 소프트웨어 및 펌웨어 개발
  2. 시뮬레이터 또는 실제 하드웨어에서의 테스트 및 디버깅
  3. RISC-V 기반 운영체제 개발

빌드 환경 설정

1. 필수 패키지 설치

RISC-V Toolchain 빌드를 위해 필요한 패키지를 설치한다.

sudo apt update
sudo apt install -y autoconf automake autotools-dev curl python3 gawk \
texinfo libtool libexpat-dev libncurses5-dev bison flex libgmp-dev \
libmpc-dev libmpfr-dev build-essential git libusb-1.0-0-dev \
libssl-dev zlib1g-dev

RISC-V Toolchain 소스 코드 다운로드

1. 소스 코드 클론

GitHub에서 RISC-V Toolchain 소스 코드를 다운로드한다.

git clone --recursive https://github.com/riscv/riscv-gnu-toolchain.git
cd riscv-gnu-toolchain

2. 하위 모듈 업데이트

--recursive 옵션으로 클론했더라도 하위 모듈이 최신 상태인지 확인한다.

git submodule update --init --recursive

로컬에서 소스코드 클론중에 아래와 같이 dejagnu를 받는데 문제가 발생했다.

error: Server does not allow request for unadvertised object ca371cf9c48186716d26c8e10d442affaf002c80
fatal: Fetched in submodule path 'dejagnu', but it did not contain ca371cf9c48186716d26c8e10d442affaf002c80. Direct fetching of that commit failed.
fatal:

아래와 같이 dejagnu를 수동으로 다운로드 받는다.

rm -rf dejagnu
git clone https://git.savannah.gnu.org/git/dejagnu.git
cd dejagnu
git checkout ca371cf9c48186716d26c8e10d442affaf002c80

상위 프로젝트로 돌아가 다시 진행한다.

cd ..
git submodule update --recursive

Newlib 기반 Toolchain 빌드

Newlib은 임베디드 환경에 적합한 경량 C 라이브러리이다. Newlib을 사용한 빌드를 아래와 같이 한다.

./configure --prefix=/opt/riscv
make

Linux 기반 Toolchain 빌드

Linux 사용자 공간 프로그램을 빌드하려면 GLIBC를 사용해야 한다. Glibc를 사용한 빌드를 위해서는 아래와 같은 옵션으로 빌드한다.

./configure --prefix=/opt/riscv --enable-linux --with-arch=rv64gc --with-abi=lp64d
make

configure 옵션은 아래와 같다.

  • --prefix: Toolchain이 설치될 경로입니다.
  • --with-arch: RISC-V ISA를 설정합니다. (rv32i, rv64gc 등)
  • --with-abi: ABI(Application Binary Interface)를 설정합니다. (ilp32, lp64, lp64d 등)
  • --enable-linux: Linux 사용자 공간 지원을 활성화합니다.

Multilib 기반 Toolchain 빌드

32비트와 64비트를 모두 지원하는 크로스 컴파일러를 빌드하려면 아래와 같이 --enable-multilib 옵션을 주어 빌드한다.

./configure --prefix=/opt/riscv --enable-multilib
make

빌드가 완료되면 /opt/riscv에 RISC-V Toolchain이 설치된다.

$ ll /opt/riscv/bin/
total 856240
drwxr-xr-x  2 jammy jammy      4096 Jan 10 11:08 ./
drwxrwxrwx 10 root  root       4096 Jan 10 10:28 ../
-rwxr-xr-x  1 jammy jammy   6055176 Jan 10 10:09 riscv64-unknown-linux-gnu-addr2line*
-rwxr-xr-x  2 jammy jammy   6234752 Jan 10 10:09 riscv64-unknown-linux-gnu-ar*
-rwxr-xr-x  2 jammy jammy   8389744 Jan 10 10:09 riscv64-unknown-linux-gnu-as*
-rwxr-xr-x  2 jammy jammy   9119960 Jan 10 11:00 riscv64-unknown-linux-gnu-c++*
-rwxr-xr-x  1 jammy jammy   5998520 Jan 10 10:09 riscv64-unknown-linux-gnu-c++filt*
-rwxr-xr-x  1 jammy jammy   9115864 Jan 10 11:00 riscv64-unknown-linux-gnu-cpp*
-rwxr-xr-x  1 jammy jammy    126256 Jan 10 10:09 riscv64-unknown-linux-gnu-elfedit*
-rwxr-xr-x  2 jammy jammy   9119960 Jan 10 11:00 riscv64-unknown-linux-gnu-g++*
-rwxr-xr-x  2 jammy jammy   9113800 Jan 10 11:00 riscv64-unknown-linux-gnu-gcc*
-rwxr-xr-x  2 jammy jammy   9113800 Jan 10 11:00 riscv64-unknown-linux-gnu-gcc-14.2.0*
-rwxr-xr-x  1 jammy jammy    160776 Jan 10 11:00 riscv64-unknown-linux-gnu-gcc-ar*
-rwxr-xr-x  1 jammy jammy    160728 Jan 10 11:00 riscv64-unknown-linux-gnu-gcc-nm*
-rwxr-xr-x  1 jammy jammy    160728 Jan 10 11:00 riscv64-unknown-linux-gnu-gcc-ranlib*
-rwxr-xr-x  1 jammy jammy   6548184 Jan 10 11:00 riscv64-unknown-linux-gnu-gcov*
-rwxr-xr-x  1 jammy jammy   5228648 Jan 10 11:00 riscv64-unknown-linux-gnu-gcov-dump*
-rwxr-xr-x  1 jammy jammy   5369760 Jan 10 11:00 riscv64-unknown-linux-gnu-gcov-tool*
-rwxr-xr-x  1 jammy jammy 184887744 Jan 10 11:08 riscv64-unknown-linux-gnu-gdb*
-rwxr-xr-x  1 jammy jammy      4627 Jan 10 11:08 riscv64-unknown-linux-gnu-gdb-add-index*
-rwxr-xr-x  1 jammy jammy   9122056 Jan 10 11:00 riscv64-unknown-linux-gnu-gfortran*
-rwxr-xr-x  1 jammy jammy  16435104 Jan 10 10:09 riscv64-unknown-linux-gnu-gp-archive*
-rwxr-xr-x  1 jammy jammy  16501864 Jan 10 10:09 riscv64-unknown-linux-gnu-gp-collect-app*
-rwxr-xr-x  1 jammy jammy    641943 Jan 10 10:09 riscv64-unknown-linux-gnu-gp-display-html*
-rwxr-xr-x  1 jammy jammy  16396888 Jan 10 10:09 riscv64-unknown-linux-gnu-gp-display-src*
-rwxr-xr-x  1 jammy jammy  16911360 Jan 10 10:09 riscv64-unknown-linux-gnu-gp-display-text*
-rwxr-xr-x  1 jammy jammy   6637496 Jan 10 10:09 riscv64-unknown-linux-gnu-gprof*
-rwxr-xr-x  1 jammy jammy  16316728 Jan 10 10:09 riscv64-unknown-linux-gnu-gprofng*
-rwxr-xr-x  4 jammy jammy  12018800 Jan 10 10:09 riscv64-unknown-linux-gnu-ld*
-rwxr-xr-x  4 jammy jammy  12018800 Jan 10 10:09 riscv64-unknown-linux-gnu-ld.bfd*
-rwxr-xr-x  1 jammy jammy 416749640 Jan 10 11:00 riscv64-unknown-linux-gnu-lto-dump*
-rwxr-xr-x  2 jammy jammy   6117272 Jan 10 10:09 riscv64-unknown-linux-gnu-nm*
-rwxr-xr-x  2 jammy jammy   6865448 Jan 10 10:09 riscv64-unknown-linux-gnu-objcopy*
-rwxr-xr-x  2 jammy jammy   9789200 Jan 10 10:09 riscv64-unknown-linux-gnu-objdump*
-rwxr-xr-x  2 jammy jammy   6234776 Jan 10 10:09 riscv64-unknown-linux-gnu-ranlib*
-rwxr-xr-x  2 jammy jammy   4344736 Jan 10 10:09 riscv64-unknown-linux-gnu-readelf*
-rwxr-xr-x  1 jammy jammy   9711560 Jan 10 11:08 riscv64-unknown-linux-gnu-run*
-rwxr-xr-x  1 jammy jammy   6045344 Jan 10 10:09 riscv64-unknown-linux-gnu-size*
-rwxr-xr-x  1 jammy jammy   6058024 Jan 10 10:09 riscv64-unknown-linux-gnu-strings*
-rwxr-xr-x  2 jammy jammy   6865448 Jan 10 10:09 riscv64-unknown-linux-gnu-strip*

환경 변수 설정

RISC-V Toolchain을 시스템 경로에 추가하여 어디서든 사용할 수 있도록 설정합니다.

echo 'export PATH=/opt/riscv/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

설정이 완료되었으면 다음 명령어로 설치 확인을 합니다.

riscv64-unknown-elf-gcc --version
$ riscv64-unknown-linux-gnu-gcc --version
riscv64-unknown-linux-gnu-gcc (g04696df096) 14.2.0
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

RISC-V Toolchain 사용법

예제 코드: hello.c

#include <stdio.h>

int main() {
    printf("Hello, RISC-V!\n");
    return 0;
}

컴파일

riscv64-unknown-linux-gnu-gcc hello.c

컴파일하여 생성된 바이너리를 확인한다.

$ file a.out
a.out: ELF 64-bit LSB executable, UCB RISC-V, RVC, double-float ABI, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64-lp64d.so.1, for GNU/Linux 4.15.0, not stripped


참고 사이트

답글 남기기