Linux 커널 Clang/LLVM 툴체인 준비하기

이 글은 리눅스 커널을 Clang/LLVM 툴체인으로 빌드하기 위한 실전 가이드다.
LLVM=1 기반의 표준 빌드 플로우, 크로스 컴파일(arm64 포함), LLD/IAS, BTF(pahole), LTO까지 한 번에 정리한다.

커널에서 말하는 “LLVM 빌드”의 의미

커널 문서에서 “Clang/LLVM로 빌드”라고 할 때 보통 아래를 뜻한다.

  • C 컴파일러: clang
  • 링커: ld.lld
  • 바이너리 유틸: llvm-ar, llvm-nm, llvm-objcopy, llvm-strip, llvm-objdump
  • (선택) 어셈블러: Clang의 통합 어셈블러(Integrated Assembler, IAS) 또는 외부 as

커널은 이들을 한 번에 맞춰서 쓰기 위해, make LLVM=1 같은 플래그를 제공한다. CC=clang만 바꿔 끼우는 방식보다 이게 “커널에서 권장하는” 접근이다.

커널 빌드 공통 필수 패키지

일반적인 커널 빌드 필수 패키지 설치

sudo apt update

sudo apt install -y \
build-essential \
bc \
flex \
bison \
libssl-dev \
libelf-dev \
dwarves \
pkg-config \
python3 \
rsync \
cpio

왜 필요한가

패키지용도
build-essentialmake, gcc(호스트 툴)
bc커널 설정/스크립트
flex / bisonKconfig, 일부 파서
libssl-devcrypto 관련 옵션
libelf-devvmlinux, BTF
dwarvespahole (BTF 필수)
python3kbuild 스크립트
cpioinitramfs
rsyncinstall 단계

⚠️ dwarves가 없으면 BTF enabled 커널에서 100% 빌드 실패한다.

커널 소스 및 빌드 환경 준비

아래 글을 참고하여 Ubuntu에서 커널 빌드 환경을 준비한다.

Clang/LLVM 패키지 설치 (Ubuntu repo 사용)

가장 간단한 방법 (권장)

sudo apt install -y llvm clang lld

설치가 완료되면, make LLVM=1에 필요한 툴체인이 완성된다.

버전 확인

clang --version
ld.lld --version
llvm-ar --version

필자의 ubuntu-24.04 에서는 아래와 같이 확인된다.

$ clang --version
Ubuntu clang version 18.1.3 (1ubuntu1)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
$ ld.lld --version
Ubuntu LLD 18.1.3 (compatible with GNU linkers)
$ llvm-ar --version
Ubuntu LLVM version 18.1.3
  Optimized build.

arm64 크로스 컴파일용 추가 패키지 (Ubuntu)

Clang 자체는 cross를 지원하지만, 외부 as / 일부 툴 / 헤더 때문에 GNU cross toolchain이 필요한 경우가 많다.

arm64 GNU cross toolchain

sudo apt install -y \
gcc-aarch64-linux-gnu \
binutils-aarch64-linux-gnu

이 경우 빌드는 보통 이렇게 한다.

make O=out ARCH=arm64 LLVM=1 \
CROSS_COMPILE=aarch64-linux-gnu- \
-j$(nproc)

Integrated Assembler 비활성화 시 (중요)

make O=out ARCH=arm64 LLVM=1 LLVM_IAS=0 \
  CROSS_COMPILE=aarch64-linux-gnu- \
  -j$(nproc)

BTF(eBPF, CO-RE) 사용하는 경우 필수 체크

pahole 확인

pahole --version
  • 권장: pahole ≥ 1.20
  • Ubuntu 22.04 / 24.04는 기본 패키지로 충분한 경우가 많다

필자의 Ubuntu에는 pahole이 설치되어 있지 않아서 아래와 같이 설치했다.

sudo apt install pahole

설치된 버전은 1.25 인 것으로 확인됐다.

$ pahole --version
v1.25

pahole이 너무 오래된 경우

sudo apt install -y dwarves

그래도 부족하면 소스 빌드가 필요하지만,
Ubuntu LTS 기준에서는 거의 드물다.

참고:

답글 남기기