본문 바로가기
프로그래밍/임베디드리눅스완전정복

임베디드리눅스완전정복 | 2장 | 툴체인

by 오답노트의 주인 2025. 11. 11.

이 카테고리의 글은 <임베디드리눅스완전정보> 책을 읽고 제 나름대로 정리한 내용을 담고 있습니다. 책 내용을 그대로 서술하지 않았습니다.


리눅스의 4가지 요소는 툴체인, 부트로더, 커널, 루트파일시스템이다. 책에서는 2~5장까지 하나씩 소개한다.

툴체인

타깃 환경

타깃 환경은 소스 코드가 최종적으로 올라가서 실행될 보드를 의미한다. 거기에 올라갈 소스 코드를 빌드하는 가장 좋은 방법은 아예 똑같은 개발 환경을 세팅한 후 소스 코드를 빌드하는 것이다. 이걸 Native-Compile이라고 부른다. 하지만 이 타깃 환경은 보통 개발자의 PC보다 성능이 떨어진다. 그러므로 타깃 환경에서 개발한다면 속이 터질 것이다. 그러므로 내 PC에서 적당히 개발하다가 빌드 시기가 다가오면 타깃 환경에 맞게 빌드하면 된다. 이걸 Cross-Compile이라고 부른다.

툴체인이란

소스 코드를 빌드하려면 컴파일러, 링커가 필요하다. 컴파일러와 링커는 결과적으로 실행 파일을 생성한다. 실행 파일은 바이너리로 된 기계어 코드이다. 기계어 코드는 하드웨어에 종속적이다. 하드웨어에 종속적이라는 것은, 어떤 게임들은 맥에서 돌아가지 않거나, 콘솔 전용 게임들을 윈도우에서 실행할 수 없는 것이 그 이유다.

따라서, 내가 빌드해서 만든 실행 파일은 다른 환경에서 제대로 동작하지 않을 수 있다. 그러면 다른 환경에서 실행 가능하도록 빌드해주는 컴파일러와 링커가 있어야 한다. 그런 관점에서, 여러 환경을 지원하는 컴파일러와 링커 및 그 외 다른 도구들이 필요해졌다. 툴체인은 그러한 도구들을 통칭하는 단어다. 책에서는 GNU에서 개발한 툴체인인 GCC을 사용해 모든 예제를 소개한다.

선택 기준

하나의 툴체인만으로 모든 환경에서 실행 가능한 실행 파일을 만들 수 없다. 그러므로 타깃 환경에서 실행 가능한 파일을 만드는 툴체인만 골라서 사용해야한다. 타깃 환경이 다양하므로 툴체인의 이름 역시 다양하다. 툴체인의 이름은 타깃 트리플렛에 따라 정해진다. cpu-vendor-os이다.

cpu

툴체인은 CPU의 아키텍처에 의존한다. 타깃 환경이 어떤 아키텍처인지에 따라 툴체인이 달라진다. 윈도우라면 x86_64, ARM 기반 칩을 사용한다면 arm이다.

vendor

툴체인 공급사다. 책에서는 GNU가 공급하는 툴체인을 사용하므로 대부분 gnu가 붙게된다.

os

리눅스 커널을 빌드할거니까 linux가 붙고, 일부 베어메탈용 커널을 빌드하는 툴체인들은 none이 붙는다.

예를 들어서 cortex_a8 시리즈 CPU를 사용하는 타깃 환경에 쓸 리눅스 커널을 빌드해야하고 GNU사에서 제공하는 툴체인을 쓴다면, 그 툴체인의 이름은 arm-cortex_a8-linux-gnu이다.

라즈베리파이5의 경우 aarch64-linux-gnu이다.

툴체인 만들기

이미 누가 만들어놓은 툴체인을 사용하면 편하지만, 만들어 놓은 툴체인을 선택했을 때 내 타깃 환경에서 사용하려는 기능이 없거나, 필요없는 설정을 끌 수 없는 경우가 있다. 또한 타깃 환경이 너무 다양하므로 내가 필요한 옵션만 킨 툴체인이 필요할 수 있다. 이럴 때 직접 타깃환경을 설정하고 툴체인을 빌드하는 방법이 있다.

crosstool-ng

https://github.com/crosstool-ng/crosstool-ng

 

GitHub - crosstool-ng/crosstool-ng: A versatile (cross-)toolchain generator.

A versatile (cross-)toolchain generator. Contribute to crosstool-ng/crosstool-ng development by creating an account on GitHub.

github.com

 

crosstool-ng는 크로스 컴파일에 쓰는 툴체인을 빌드해주는 오픈소스 소프트웨어다. GPL 2.0 라이센스를 따른다.

책에서는 위 깃허브 리포지토리를 클론한 뒤 make 명령어를 사용해 툴체인을 빌드하는 방법을 알려주고 있다.

git clone git@github.com:crosstool-ng/crosstool-ng
cd crosstool-ng
# autotools 스크립트인 configure 파일 생성
./bootstrap

# 빌드 환경 설정 및 설치될 경로를 --prefix로 지정
# 이 명령어의 결과로 Makefile이 생성된다.
./configure --prefix=${PWD}

# 리포지토리 소스 컴파일, ct-ng 실행파일 및 관련 도구들이 빌드됨
make 

# 빌드된 실행파일과 스크립트들을 --prefix 경로에 설치
make install

 

위 명령어 실행중에 에러가 뜬다면 보통 관련된 패키지가 개발환경에 설치되지 않아서 그렇다. 오류 메세지를 그대로 검색하면 해결방법 대부분이 apt install ... 이다.

이렇게 툴체인 빌드를 위한 환경을 구성하면 crosstool-ng/bin/에 ct-ng 실행 파일이 있다. 다음과 같이 실행하면 만들 수 있는 툴체인 목록을 보여준다.

bin/ct-ng list-samples

 

맥북에어 m2에 설치하고 실행해보았다.

❯ bin/ct-ng list-samples
Status  Sample name
[L...]   aarch64_be-unknown-linux-gnu
[L...]   aarch64_be-unknown-linux-musl
(생략)
[L...]   aarch64-ol9u6-linux-gnu
[L...]   aarch64-rpi3-linux-gnu
[L...]   aarch64-rpi4-linux-gnu
[L...]   aarch64-unknown-linux-gnu
[L...]   aarch64-unknown-linux-musl
[L...]   aarch64-unknown-linux-uclibc
(생략)
[L...]   arm-cortex_a15-linux-gnueabihf
[L...]   arm-cortex_a8-linux-gnueabi
[L..X]   arm-cortexa5-linux-uclibcgnueabihf
[L..X]   arm-cortexa9_neon-linux-gnueabihf
(생략)
[L...]   arm-unknown-linux-gnueabi
[L..X]   arm-unknown-linux-musleabi
[L...]   arm-unknown-linux-uclibcgnueabi
[L..X]   arm-unknown-linux-uclibcgnueabihf
[L...]rmeb-unknown-eabi
[L...]   armeb-unknown-linux-gnueabi
[L...]   armeb-unknown-linux-uclibcgnueabi
[L...]   armv6-nommu-linux-uclibcgnueabi
[L...]   armv6-unknown-linux-gnueabi
[L...]   armv6-unknown-linux-gnueabihf
[L...]   armv7-rpi2-linux-gnueabihf
[L...]   armv8-rpi3-linux-gnueabihf
[L...]   armv8-rpi4-linux-gnueabihf
(생략)

이렇게 툴체인 목록이 쭉 뜬다. 빌드하고자 하는 툴체인 이름을 bin/ct-ng 실행파일의 인자로 넣으면 해당 툴체인 빌드를 위한 설정이 완료된다.

세세한 설정을 수정하고 싶다면 bin/ct-ng menuconfig를 실행한다. 다음 사진처럼 바이오스화면같은게 나온다.

설정이 완료되었다면 bin/ct-ng build를 실행하여 툴체인을 빌드한다. 꽤 오래걸린다.

라즈베리파이5를 위한 툴체인은?

위 목록에서 볼 수 있듯 rpi는 라즈베리파이를 의미한다. 라즈베리파이3,4는 있지만 라즈베리파이5가 없다!

다행히, 공식문서에서 툴체인을 빌드하지 말고 이미 빌드된 툴체인을 쓰라고 알려준다.

 

https://www.raspberrypi.com/documentation/computers/linux_kernel.html#cross-compile-the-kernel

 

The Linux kernel - Raspberry Pi Documentation

The official documentation for Raspberry Pi computers and microcontrollers

www.raspberrypi.com

 

  1. 필요한 패키지들을 설치한다.
sudo apt install bc bison flex libssl-dev make libc6-dev libncurses5-dev
  1. 툴체인을 설치한다.
sudo apt install crossbuild-essential-arm64

 

32비트 툴체인을 설치해야하면 다음 명령어를 실행한다.

sudo apt install crossbuild-essential-armhf

 

다음장에서는 이렇게 만들거나 설치한 툴체인으로 부트로더를 만든 후 보드에 올려서 커널을 부팅할 준비를 하기 위해 u-boot에 대해 배운다.

라즈베리파이 5는 내부 펌웨어에 의해 이미 부트로더 비스무리한 것이 들어있으므로 3장을 건너뛰어도 커널을 올리는데 어려움이 없었다.

 

댓글