Linux 커널은 전통적으로 GCC로 빌드되어 왔다. 하지만 최근 몇 년간 Clang / LLVM 기반 빌드가 빠르게 확산되었다.
현재는 둘 다 “정식 지원” 상태이며, 차이는 “지원 여부”가 아니라 특성의 차이에 가깝다.
가장 큰 구조적 차이

GCC
- 단일 프로젝트(컴파일러 + 옵티마이저 + 링커 연계)
- 내부 IR(GIMPLE/RTL)는 GCC 내부 전용
- 전통적인 Unix 컴파일러 모델
Clang/LLVM
- 프론트엔드(Clang) + 공통 IR(LLVM IR) + 백엔드 분리
- 링커(ld.lld), binutils(llvm-objcopy 등)까지 LLVM 생태계
- 분석·계측 도구와 자연스럽게 연결됨
커널 빌드 자체보다 “빌드 이후 작업”에서 차이가 커진다.
빌드 방식 차이 (kbuild 관점)
GCC 빌드
make -j$(nproc)
- 기본값
- 배포판, 벤더 커널의 표준
Clang 빌드
make LLVM=1 -j$(nproc)
이 한 줄로 다음이 모두 바뀐다.
| 항목 | GCC | Clang |
|---|---|---|
| C 컴파일러 | gcc | clang |
| 링커 | ld.bfd | ld.lld |
| objcopy | objcopy | llvm-objcopy |
| strip | strip | llvm-strip |
Clang은 “툴체인 묶음 교체”에 가깝다.
빌드 성공률과 안정성
GCC
- 거의 모든 커널/벤더 트리에서 무조건 됨
- 오래된 inline asm, GCC 확장에 강함
- “안 되는 경우를 찾기 어려움”
Clang
- 메인라인 기준 안정
- 오래된 벤더 커널에서는:
- inline asm
- section attribute
- volatile asm constraint
에서 깨지는 경우가 여전히 있음
- 하지만 매 릴리즈마다 개선 중
LTS + 벤더 트리 → GCC 안정
메인라인 / 최신 커널 → Clang도 충분히 실사용
빌드 속도와 리소스 사용
컴파일 시간
- Clang: 대체로 조금 더 빠름
- GCC: 안정적이나 대규모 빌드에서 느린 편
링크 시간
- ld.lld (Clang): 체감될 정도로 빠름
- ld.bfd (GCC): 대형 커널에서 병목
특히 다음에서 차이가 크다.
- LTO
- 디버그 심볼 많을 때
- vmlinux 링크 단계
“커널 빌드가 느리다” → 링커 차이인 경우가 많다
진단 메시지와 디버깅 체감
컴파일 에러 메시지
| 항목 | GCC | Clang |
|---|---|---|
| 에러 위치 | 거칠다 | 매우 정확 |
| 원인 설명 | 짧음 | 구체적 |
| 매크로 에러 | 읽기 힘듦 | 비교적 친절 |
Clang 예시:
error: use of undeclared identifier 'foo'
bar = foo;
^
커널 설정/조건부 컴파일 디버깅 시 Clang이 훨씬 편하다
LTO 지원 차이
GCC LTO
- 설정 복잡
- 빌드/링크 비용 큼
- 벤더 환경에서 잘 안 쓰임
Clang LTO
- ThinLTO 지원
- ld.lld와 궁합 좋음
- 메인라인에서 점점 기본 옵션으로 논의 중
LTO 실험은 Clang 쪽이 훨씬 현실적
BTF / eBPF / 디버깅 관점 차이
여기서 Clang의 강점이 명확해진다.
GCC
- BTF 지원 가능
- eBPF는 별도 clang 사용
- CO-RE 흐름과는 다소 분리됨
Clang
- 커널 + eBPF가 같은 LLVM 생태계
- BTF, DWARF, pahole 연계가 자연스러움
- CO-RE(eBPF) 개발 시 궁합이 매우 좋음
eBPF 중심 개발 환경이면 Clang이 사실상 표준
Sanitizer / 분석 도구 차이
| 항목 | GCC | Clang |
|---|---|---|
| KASAN | 지원 | 더 안정적 |
| UBSAN | 제한적 | 강력 |
| TSAN | 거의 불가 | 가능 |
| Static Analyzer | 제한 | clang-analyzer |
Clang 기반 sanitizer는
커널 메모리 버그 분석에서 체감 차이가 큼.
실무 기준 선택 가이드
GCC를 선택하는 경우
- 오래된 벤더 커널
- BSP 유지보수 위주
- “무조건 빌드돼야 함”
- CI 안정성이 최우선
Clang을 선택하는 경우
- 메인라인 기반 개발
- eBPF / BTF / CO-RE
- 메모리 버그 분석
- 빌드 속도 개선
- 미래 지향적 툴체인