시스템 소프트웨어 개발자가 주로 하는 일 중엔 갓 구운 따끈한 보드에 OS를 올리는 Bring-up 업무가 있다고 한다. 그리고 이를 잘 하기 위해선? Booting Process를 잘 숙지하고 있어야 한다고 한다.
그래서! 책 '임베디드 리눅스 프로그래밍 완전정복'와 유튜브 강의를 참고해서, 비글본블랙에 Linux를 올려보면서 디버깅 역량 및 부팅 프로세스를 체득해보고자 한다.
요 글은 책 '임베디드 리눅스 프로그래밍 완전정복, 프랭크 바스케즈-크리스 시먼스, 에이콘 출판서(2024)'을 참고하여 썼음을 밝힙니다.
SoC 비글본블랙에 Linux를 올리기 위해 무엇을 알아야 할까?
책 1장 p49를 보면 다음과 같은 내용이 나온다.
모든 임베디드 리눅스 프로젝트는 '툴체인', '부트로더', '커널', '루트 파일시스템' 이라는 4가지 요소를 마련하고, 구미에 맞도록 수정한 다음 배포하면서 시작한다고 한다. 간략하게 4요소를 먼저 살펴보자면 다음과 같다(고 한다).
- 툴체인: 리눅스를 심을 타깃 장치를 위한 코드를 만드는데 필요한 '컴파일러'와 기타 도구로 구성됨
- 부트로더: 보드를 초기화하고 리눅스 커널을 로드하는 프로그램
- 커널: 시스템의 심장부로, 시스템 자원을 관리하며 하드웨어와의 접점이다.
- 루트 파일시스템: 커널이 초기화를 끝낸 뒤 실행되는 라이브러리와 프로그램을 담고 있다.
흔히 SoC나 보드를 사면 이들 요소 전부나 일부를 패키지로 제공받는다. 하지만 나의 상황에 최적인 리눅스를 직접 만들기 위해선 네가지 요소를 구미에 맞게 조절해야한다. 바로 툴체인부터 공부해보자!
(1) 리눅스 이식 4요소 중 첫째인 '툴체인'을 배우자
'툴체인'이란 무엇일까?
The GNU Toolchain is a set of programming tools in Linux systems that programmers can use to make and compile their code to produce a program or library.
솔직히 텍스트 설명만 읽고는 잘 와닿진 않지만, 소스 코드를 타깃 장치에서 실행할 수 있는 실행파일로 만들어주는 컴파일러/링커/라이브러리 가 포함된 컴파일 도구모음이라고 우선 이해하고 넘어가본다.
툴체인은 디바이스에서 실행될 모든 코드를 컴파일하며, 어떤 툴체인을 선택하느냐가 최종 산출물에 어마어마한 영향을 미치는 아주 중요한 요소이다. 툴체인은 사용 프로세서를 위한 최적의 명령어 세트를 사용함으로서 하드웨어를 효과적으로 사용할 수 있게 해야한다. 또한 프로젝트에 필요한 언어를 지원해야 하고 POSIX와 기타 시스템 인터페이스에 대한 믿음직한 구현(?)을 갖고 있어야 한다. 참고로, 툴체인은 프로젝트 내내 바뀌지 않아야 한다. 이유는 함부로 툴체인을 건들면 감지하기 힘든 버그를 낳기 쉽기 때문이다. 하지만 보안 결함이나 버그가 발견되면 툴체인을 업데이트 하는 것이 좋다.
아무래도 기계어로 변환해주는 컴파일러가 있다보니 어떤 툴체인을 선택하느냐가 빌드될 실행파일(OS)의 효율성에 직격으로 연결이 되는 것 같다.
흔히 리눅스용 툴체인은 GNU 프로젝트에서 만들어진 요소에 기반을 둔다고 한다. Clang 컴파일러와 관련된 LLVM 프로젝트라는 툴체인도 있다고 하는데, 요녀석은 코드 오픈을 요구하는 GPL라이선스의 GNU와 달리 BSD라이선스가 있어서 소스코드를 공개하지 않아도 된다고 한다(방산 처럼 특수 분야에서 많이 애용하지 않을까?).
GNU기반 툴체인과 Clang기반 툴체인의 trade-off는 무엇일까? 어느 상황에서 무엇을 선택하는게 좋을까?
- Clang은 우선 소스코드를 공개하지 않아도 된다는 장점이 있고, GCC대비 컴파일이 조금 더 빠르며, 향상된 진단 기능 등의 장점이 있다고 한다.
- GNU GCC는 아무래도 근본인 만큼, 기존 코드와의 호환성과 광범위한 아키텍처와 OS지원이라는 장점이 있다. 도구의 성숙성이 높다는 장점도 있다고 한다.
👉배우는 상황인 만큼 우선은 자료가 많은 GCC로 툴체인을 구성해본다!
툴체인의 종류
툴체인은 크게 두가지 종류로 나눌 수 있다.
- 네이티브: 코드를 작성하고 빌드하는 환경(Host)과 만들어진 실행파일이 실행되는 환경(Target)이 동일한 경우.
네이티브 툴체인: 임베디드 디바이스에서 직접 코드를 짜고 컴파일(gcc)하여 실행파일을 만드는 방식(라즈베리파이가 네이티브 컴파일러를 가지고 있다). - 크로스: 코드를 빌드하는 환경(Host)과 실행되는 환경(Target)이 다른 경우.
크로스 툴체인: 빠른 데스크톱 PC에서 개발한 다음 임베디드 디바이스에 로드해 테스트하는 것.
👉비글본블랙에서 컴파일을 할 수 없거니와, 내 데스크탑은 Arm도 아니기 때문에(심지어 비글본블랙은 32bit), 크로스 툴체인으로 비글본 블랙 부팅에 필요한 요소들을 빌드해 본다!
CPU 아키텍처
툴체인은 타깃에서 실행될 실행파일을 만들기 때문에, 타깃 CPU의 특징에 맞게 빌드돼야 한다. 다음과 같은 사항을 고려해서 툴체인을 빌드하면 된다!
- CPU 아키텍처: ARM, MIPS, x86_64
- 빅 엔디언 혹은 리틀 엔디언
- 부동소수점 지원: 모든 임베디드 프로세서가 FPU을 보유하지 않는다. 이 경우 툴체인은 부동소수점 라이브러리를 부르도록 설정할 수 있다.
- ABI: Application Binary Interface의 약자로, 함수 호출 간에 인자를 넘기는 호출 규칙. ABI는 같은 계열 프로세서에서 동일하다.
C 라이브러리 고르기
UNIX OS의 프로그래밍 인터페이스는 C로 정의돼있는데, 지금은 POSIX 표준으로 정의돼있다. C라이브러리는 그 인터페이스의 구현으로, 애플리케이션에서 리눅스 커널로 연결되는 관문이다. 자바나 파이썬같은 언어로 프로그램을 작성하더라도, 각 런타임 지원 라이브러리는 결국 C 라이브러리를 사용하게 된다.
선택할 수 있는 몇 가지 C라이브러리가 있다!
- glibc
- musl libc
- uClibc-ng
- eglibc
(2) crosstool-NG 를 이용해 비글본블랙 툴체인을 빌드해보자!
책 왈, 오늘날 crosstool-NG는 소스로부터 독립형 크로스 툴체인을 만드는 가장 편리한 방법이라고 한다. 요놈을 사용하여 비글본블랙에 Linux를 불어넣기 위한 툴체인을 만들어보자!
소스에서 crosstool-NG를 빌드하기에 앞서서, 먼저 작동하는 네이티브 툴체인과 빌드 도구들을 호스트에 설치해야 할 것이다. 아래 도구들을 나의 Ubuntu 24.04LTS 에 설치해 주었다.
sudo apt-get install autoconf automake bison bzip2 cmake flex g++ \
gawk gcc gettext git gperf help2man libncurses5-dev libstdc++6 \
libtool libtool-bin make patch python3-dev rsync texinfo unzip \
wget xz-utils
이후 crosstool-NG를 다운받아주었다. 나는 책에서 사용한 1.24.0 버전을 사용했다. 압축을 해제하고 아래 명령을 이용해 프론트엔드 메뉴 시스템 ct-ng를 만들었다.
git clone https://github.com/crosstool-ng/crosstool-ng.git
cd crosstool-ng
git checkout crosstool-ng-1.24.0
./bootstrap
./configure --prefix=${PWD}
make
make install
이제 크로스 툴체인을 구축할 수 있는 crosstool-NG가 설치됐다.
crosstool-ng configuration 설정하기
설치는 했는데, 이제 이걸 어떻게 사용하는 것일까? documentation(https://crosstool-ng.github.io/docs/configuration/)을 보니 빌드에 앞서서 configuration을 먼저 진행하라고 한다.
툴체인 옵션을 구체화하기 전에 비글본 블랙의 스펙을 확인해보자.


비글본블랙은 Arm Cortex-A8 코어, NEON 부동소수점 가속기가 있는 SoC를 가지고 있다. 또한, RAM과 Disk도 각각 512MB와 4GB를 보유하고있다.
glibc를 사용하려면 Disk에 수십 MB의 용량이 필요하고, 프로세스당 수 MB의 RAM이 요구된다(출처: https://tuxcare.com/blog/musl-vs-glibc/). 고로, 비글본 블랙은 충분히 glibc를 C라이브러리로 쓸 수 있다!
crosstool-ng에는 빌드 및 작동이 확인된 사전 구성된 `샘플 툴체인`이 포함되어있어서 세부 설정을 시작할 시작점으로 삼을 수 있다. 오픈소스가 이렇게 친절할 줄이야.. 아래 명령어를 입력하면 사용 가능한 샘플들을 확인할 수 있다.
./ct-ng list-samples

나는 Cortex-A8에 부동소수점 계산 하드웨어가 있는 SoC의 비글본 블랙을 사용하기 때문에, 하이라이트한 `arm-cortex_a8-linux-gnueabi` 툴체인을 사용하면 될 것 처럼 보인다. 하지만, 뒤에 붙은 gnueabi를 보니, NEON 부동소수점 가속기를 사용하지 않는 방식의 soft-float ABI임을 알 수 있다.
(샘플 끝에 붙는 gnueabi, gnueabihf 이것들은 무슨 의미일까? 요 글에 자세히 정리해보았다!!)
참고로 아래 명령어를 입력하면 샘플의 세부 구성을 볼 수 있다.
./ct-ng show-{내 설정 이름}

기본 제공되는 arm-cortex_a8-linux-gnueabi 구성은 정수 레지스터의 부동소수점 인수를 전달하는 eabi 바이너리 인터페이스를 사용하는 점을 제외하면 요구 사항과 거의 일치한다(gnueabi 단어가 궁금하시다면 이 글을 참고하세요).
이 타깃 구성에서부터 시작해 BBB에 맞춰가보자.

다음과 같이 명령어를 입력해 해당 타깃 구성을 선택해주었다. 이제 menuconfig에 들어가서 BBB에 맞게 타깃 구성을 바꿔보자.

`./ct-ng menuconfig`를 입력하면 다음과 같은 메뉴가 뜬다.
여기서 어떤 설정을 바꾸어야 비글본 블랙에 적합한 설정을 할 수 있을까?
- Paths and misc options 에서 Render the toolchain read-only를 끈다.
--> 툴체인을 설치한 뒤에 라이브러리를 추가하기 위함이다. - Target options >> Floating point 에서 hardware(FPU) 를 선택.
--> 비글본블랙은 NEON FPU를 가지고 있기 때문에 eabihf 바이너리 인터페이스를 선택한다. - Target options >> Use specific FPU 에 neon을 입력한다.
--> 리눅스 커널을 성공적으로 빌드하기 위함이라고 한다. 아직은 이 말을 이해 못하겠다..
이제 아래 명령을 입력해 crosstool-NG를 사용함으로써 내가 지정한 대로 요소를 얻고 구성하고 빌드할 수 있다.
./ct-ng build
Retrieving needed toolchain components 오류가 뜨는 경우, 이 글을 참고하세요.
빌드는 30분~1시간 정도 걸릴 것이고, 그 뒤 `~/x-tools/arm-cortex_a8-gnueabihf/`에서 툴체인을 찾을 수 있다.
'Embedded Systems > 리눅스' 카테고리의 다른 글
| [Linux] crosstool-ng 빌드시 'Retrieving needed toolchain components' 에러 디버깅 (0) | 2026.03.27 |
|---|---|
| [Linux] gnueabi vs gnueabihf 차이를 이해해보자(ABI) (0) | 2026.03.25 |
| [Linux] 임베디드 리눅스 부팅 순서 + 비글본 블랙(BBB) 부팅 순서 (0) | 2026.03.17 |
| [Linux] 임베디드 리눅스 부팅 타임 최적화 (0) | 2025.11.19 |
| [Linux] BBB Linux boot time 최적화 #0 (0) | 2025.11.04 |
