이 글은 리눅스 커널을 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-essential | make, gcc(호스트 툴) |
| bc | 커널 설정/스크립트 |
| flex / bison | Kconfig, 일부 파서 |
| libssl-dev | crypto 관련 옵션 |
| libelf-dev | vmlinux, BTF |
| dwarves | pahole (BTF 필수) |
| python3 | kbuild 스크립트 |
| cpio | initramfs |
| rsync | install 단계 |
⚠️
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 기준에서는 거의 드물다.
참고:
- Linux kernel 공식 문서 – Clang/LLVM으로 커널 빌드하기
https://docs.kernel.org/kbuild/llvm.html
→LLVM=1,LLVM_IAS, kbuild에서의 공식 지원 방식 정리 - Linux kernel 공식 문서 – 빌드 최소 요구 사항(Changes)
https://docs.kernel.org/process/changes.html
→ 커널 빌드에 필요한 필수 툴/패키지 목록 - LLVM 공식 문서
https://llvm.org/docs/
→ clang, lld, llvm-binutils 구성 이해용 - ClangBuiltLinux 프로젝트
https://github.com/clangbuiltlinux
→ 실제 커널을 clang으로 빌드하는 커뮤니티와 이슈 트래킹 - Linux kernel – BTF / pahole 문서
https://docs.kernel.org/bpf/btf.html
→dwarves(pahole)가 왜 필요한지에 대한 배경 설명