커널 포팅 (2. 커널 소스 분석 및 빌드 / 2.3 크로스 컴파일러를 이용한 커널 빌드)

2025. 3. 6. 19:39프로그래밍/시스템

2.3 크로스 컴파일러를 이용한 커널 빌드

리눅스 커널은 여러 하드웨어 아키텍처에서 실행될 수 있도록 설계되었습니다.
하지만 커널을 빌드할 때는 개발 환경과 실행할 하드웨어의 아키텍처가 다를 수 있습니다.
이런 경우 크로스 컴파일러(Cross Compiler) 를 사용하여 타겟 아키텍처에 맞게 커널을 빌드해야 합니다.


🔹 크로스 컴파일러란?

크로스 컴파일러(Cross Compiler)개발 환경(Host)과 실행 대상(Target)의 CPU 아키텍처가 다른 경우 사용하는 컴파일러입니다.
즉, x86 기반의 개발 PC(Host)에서 ARM 또는 RISC-V 기반의 임베디드 보드(Target)용 커널을 빌드할 때 사용됩니다.

크로스 컴파일러가 필요한 이유

  • x86 PC에서 ARM, RISC-V 등의 아키텍처용 커널을 빌드할 수 있음
  • 성능이 낮은 임베디드 보드에서 직접 컴파일하는 것보다 훨씬 빠름
  • 개발 환경과 실행 환경이 다를 때, 하드웨어별로 최적화된 바이너리 생성 가능

크로스 컴파일과 네이티브 컴파일 비교

구분  네이티브 컴파일 크로스 컴파일
개발 환경 Target(예: ARM 보드)에서 직접 컴파일 Host(예: x86 PC)에서 Target(ARM)용으로 컴파일
속도 느림 (임베디드 환경은 성능이 낮음) 빠름 (x86 PC에서 빌드)
사용 목적 서버/데스크톱 개발 임베디드 개발 (라즈베리파이, BeagleBone 등)

크로스 컴파일러 예시

아키텍처  크로스 컴파일러 명령어
ARM 32-bit arm-linux-gnueabi-gcc
ARM 64-bit aarch64-linux-gnu-gcc
RISC-V riscv64-linux-gnu-gcc

🔹 ARM 계열을 위한 GCC 크로스 컴파일러 설치

크로스 컴파일러는 GCC(GNU Compiler Collection) 기반으로 제공되며,
Ubuntu 및 Debian 환경에서는 패키지 관리자로 쉽게 설치할 수 있습니다.

1️⃣ 크로스 컴파일러 설치 (Ubuntu / Debian)

# 32비트 ARM (arm-linux-gnueabi)
sudo apt update
sudo apt install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi -y

# 64비트 ARM (aarch64-linux-gnu)
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu -y

2️⃣ 설치 확인

arm-linux-gnueabi-gcc --version
aarch64-linux-gnu-gcc --version

정상적으로 버전 정보가 출력되면 설치 완료.

3️⃣ 크로스 컴파일러 수동 설치 (최신 버전) 만약 최신 버전이 필요하면 ARM 공식 사이트에서 직접 다운로드하여 설치할 수도 있습니다.

# ARM 32-bit 크로스 컴파일러 다운로드
wget https://ftp.gnu.org/gnu/gcc/gcc-10.3.0/gcc-10.3.0.tar.gz
tar -xvf gcc-10.3.0.tar.gz
cd gcc-10.3.0
./configure --target=arm-linux-gnueabi --prefix=/usr/local/gcc-arm
make -j$(nproc)
sudo make install

4️⃣ 경로 추가 (수동 설치한 경우)

export PATH=$PATH:/usr/local/gcc-arm/bin

이제 arm-linux-gnueabi-gcc 명령어를 사용할 수 있습니다.


🔹 커널을 크로스 컴파일하는 방법

크로스 컴파일러를 사용하여 커널을 빌드할 때는 make 명령어에 ARCH와 CROSS_COMPILE 변수를 지정해야 합니다.

1️⃣ 기본 설정 파일 로드

cd linux
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- rpi_defconfig
  • ARCH=arm → 타겟 아키텍처를 ARM으로 설정
  • CROSS_COMPILE=arm-linux-gnueabi- → ARM 용 크로스 컴파일러 사용
  • rpi_defconfig → 라즈베리파이 기본 설정 적용

2️⃣ 커널 빌드

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- zImage -j$(nproc)
  • zImage는 ARM 아키텍처용 압축된 커널 이미지

3️⃣ 디바이스 트리 빌드

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs
  • dtbs는 디바이스 트리 블롭(Device Tree Blob) 파일을 생성

4️⃣ 모듈 빌드

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules_install INSTALL_MOD_PATH=output/
  • 모듈을 별도로 빌드하고 output/ 디렉토리에 설치

5️⃣ 빌드된 커널 이미지 확인

ls arch/arm/boot/
  • zImage, dts/ 디렉토리 등이 생성되었는지 확인

🔹 크로스 컴파일 시 유용한 팁

1️⃣ 지원하는 아키텍처 확인

make ARCH=arm help
  • 지원하는 보드 및 설정 목록 출력

2️⃣ make clean 및 make mrproper 사용

make ARCH=arm clean         # 오브젝트 파일 정리
make ARCH=arm mrproper      # 설정 파일도 삭제
  • 새롭게 빌드를 시작할 때 필요

3️⃣ 크로스 컴파일러가 정상적으로 동작하는지 테스트

echo 'int main() { return 0; }' > test.c
arm-linux-gnueabi-gcc -o test test.c
file test
  • 출력 결과가 ELF 32-bit LSB executable, ARM이라면 정상적으로 빌드됨

4️⃣ make -j$(nproc) 옵션 사용

  • -j$(nproc)를 추가하면 CPU 코어 개수만큼 병렬 컴파일을 수행하여 빌드 속도를 빠르게 할 수 있음

✅ 정리

  1. 크로스 컴파일러란?
    • 개발 환경(Host)과 실행 환경(Target)이 다를 때 사용하는 컴파일러
    • x86 PC에서 ARM 또는 RISC-V 등 타겟용 커널을 빌드할 때 필요
  2. 크로스 컴파일러 설치
    • sudo apt install gcc-arm-linux-gnueabi (ARM 32-bit)
    • sudo apt install gcc-aarch64-linux-gnu (ARM 64-bit)
  3. 커널 빌드 과정
    • make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
    • make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- zImage
    • make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs
    • make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules
    • make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules_install
  4. 빌드된 커널 파일 확인
    • arch/arm/boot/zImage
    • arch/arm/boot/dts/*.dtb