LLVM을 통해 리눅스 커널을 빌드할 수 있도록 만드는 중이라고 한다.
아래 링크에 보면 arm64는 이미 (2022.09.11 기준) LLVM을 이용해 빌드가 가능하다고 한다.
https://docs.kernel.org/kbuild/llvm.html#supported-architectures
대체로 아래에 작성한 내용과 같은데, 필요한 패키지와 컴파일 옵션이 조금 다르다.
https://velog.io/@pikamon/Linux-Kernel-1
아래 환경에서 빌드하였다.
빌드 환경
x86_64 Ubuntu 22.04 docker container
타겟 머신
aarch64 cross compile
Github에서 Linux 소스를 Clone하였다.
apt update
apt install -y git
git clone https://github.com/torvalds/linux.git
cd linux
git tag 명령어를 통해 릴리즈된 커널 버전을 볼 수 있다.
git tag --sort=-creatordate | head -10
입력하면 아래와 같이 상위 10개 버전의 태그를 확인할 수 있다.
v6.0-rc4
v6.0-rc3
v6.0-rc2
v6.0-rc1
v5.19
v5.19-rc8
v5.19-rc7
v5.19-rc6
v5.19-rc5
v5.19-rc4
2022년 9월 11일 기준으로 v6.0-rc4까지 나온 것을 볼 수 있다.
원하는 버전을 찾은 후 git reset을 입력한다.
예) v6.0-rc4
> git reset --hard v6.0-rc4
Linux 커널 빌드에 필요한 프로그램들을 설치한다.
대략 아래 정도면 빌드하는 데에 문제 없었다.
apt install -y llvm clang lldb lld \
cscope libssl-dev libncurses-dev\
autoconf automake autotools-dev curl libmpc-dev libmpfr-dev \
libgmp-dev gawk build-essential bison flex texinfo \
gperf libtool patchutils bc zlib1g-dev libexpat-dev
gcc-aarch64-linux-gnu 처럼 크로스 빌드 툴이 아키텍처 별로 나뉘어져 있는 GCC와는 달리, LLVM은 한 패키지 안에 몽땅 들어있는 것 같다.
명령어를 하나씩 따라서 입력한다.
기존에 설정된 모든 의존 관계를 제거할 때 사용하는 명령어이다.
make mrproper
입력하면 아래와 같이 출력된다.
CLEAN scripts/basic
CLEAN scripts/kconfig
CLEAN include/config include/generated .config
타겟 보드에 맞게 사전에 기본 설정을 미리 해둘 때 사용하는 명령어이다.
LLVM=1 옵션을 입력하면 LLVM을 이용해 과정을 수행한다고 한다.
make ARCH=arm64 LLVM=1 defconfig
입력하면 아래와 같이 출력된다.
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
HOSTCC scripts/kconfig/confdata.o
HOSTCC scripts/kconfig/expr.o
LEX scripts/kconfig/lexer.lex.c
YACC scripts/kconfig/parser.tab.[ch]
HOSTCC scripts/kconfig/lexer.lex.o
HOSTCC scripts/kconfig/menu.o
HOSTCC scripts/kconfig/parser.tab.o
HOSTCC scripts/kconfig/preprocess.o
HOSTCC scripts/kconfig/symbol.o
HOSTCC scripts/kconfig/util.o
HOSTLD scripts/kconfig/conf
*** Default configuration is based on 'defconfig'
#
# configuration written to .config
#
커널에 추가/제거할 기능이나 모듈을 세부적으로 설정할 때 사용하는 명령어이다.
마찬가지로 LLVM=1 옵션을 붙여준다.
make ARCH=arm64 LLVM=1 menuconfig
입력하면 대화형 dialog가 출력되며, exit 시 아래와 같이 출력된다.
UPD scripts/kconfig/mconf-cfg
HOSTCC scripts/kconfig/mconf.o
HOSTCC scripts/kconfig/lxdialog/checklist.o
HOSTCC scripts/kconfig/lxdialog/inputbox.o
HOSTCC scripts/kconfig/lxdialog/menubox.o
HOSTCC scripts/kconfig/lxdialog/textbox.o
HOSTCC scripts/kconfig/lxdialog/util.o
HOSTCC scripts/kconfig/lxdialog/yesno.o
HOSTLD scripts/kconfig/mconf
*** End of the configuration.
*** Execute 'make' to start the build or try 'make help'.
커널을 빌드하는 명령어이다.
마찬가지로 LLVM=1 옵션을 붙여준다.
make ARCH=arm64 LLVM=1 -j$(nproc)
시간을 따로 측정하진 않았는데, GCC로 빌드할 때와 큰 차이는 없었던 것 같다.
빌드가 완료되면 linux 디렉토리 안에 vmlinux가 들어있는 것을 볼 수 있다.
ls
그리고 arch/arm64/boot 안에 Image가 들어있는 것을 볼 수 있다.
cd arch/arm64/boot
ls