[Linux] Aarch64 리눅스 커널 크로스 컴파일 방법 (using LLVM)

pikamon·2022년 8월 23일
0

Linux Kernel

목록 보기
2/3

LLVM을 통해 리눅스 커널을 빌드할 수 있도록 만드는 중이라고 한다.

아래 링크에 보면 arm64는 이미 (2022.09.11 기준) LLVM을 이용해 빌드가 가능하다고 한다.
https://docs.kernel.org/kbuild/llvm.html#supported-architectures

대체로 아래에 작성한 내용과 같은데, 필요한 패키지와 컴파일 옵션이 조금 다르다.
https://velog.io/@pikamon/Linux-Kernel-1


1. 빌드 환경 소개

아래 환경에서 빌드하였다.

  • 빌드 환경

    x86_64 Ubuntu 22.04 docker container

  • 타겟 머신

    aarch64 cross compile

2. 빌드 방법

1. 프로젝트 내려받기

Github에서 Linux 소스를 Clone하였다.

apt update
apt install -y git
git clone https://github.com/torvalds/linux.git
cd linux

2. 커널 버전 설정

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

3. 빌드 툴 설치

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은 한 패키지 안에 몽땅 들어있는 것 같다.

4. 커널 빌드

명령어를 하나씩 따라서 입력한다.

1. make mrproper

기존에 설정된 모든 의존 관계를 제거할 때 사용하는 명령어이다.

make mrproper

입력하면 아래와 같이 출력된다.

  CLEAN   scripts/basic
  CLEAN   scripts/kconfig
  CLEAN   include/config include/generated .config

2. make defconfig

타겟 보드에 맞게 사전에 기본 설정을 미리 해둘 때 사용하는 명령어이다.
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
#

3. make menuconfig

커널에 추가/제거할 기능이나 모듈을 세부적으로 설정할 때 사용하는 명령어이다.
마찬가지로 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'.

4. make

커널을 빌드하는 명령어이다.
마찬가지로 LLVM=1 옵션을 붙여준다.

make ARCH=arm64 LLVM=1 -j$(nproc)

시간을 따로 측정하진 않았는데, GCC로 빌드할 때와 큰 차이는 없었던 것 같다.

5. 빌드 산출물 확인

빌드가 완료되면 linux 디렉토리 안에 vmlinux가 들어있는 것을 볼 수 있다.

ls

그리고 arch/arm64/boot 안에 Image가 들어있는 것을 볼 수 있다.

cd arch/arm64/boot
ls

profile
개발자입니당 *^^* 깃허브 https://github.com/pikamonvvs

0개의 댓글