툴체인(toolchain)이란? 소스 코드를 타겟(target) 장치에서 실행할 수 있는 실행 파일로,
컴파일러, 링커, 런타임 라이브러리를 포함하는 컴파일 도구의 집합이다.
부트로더, 커널, 루트 파일시스템을 빌드하기 위해서 툴체인이 필요하다.
흔히 리눅스용 툴체인은 GNU 프로젝트에서 만들어진 요소에 기반을 두고 있다.
표준 GNU 툴체인은 3가지 주요 요소로 이루어져 있다.
Binutils
어셈블러와 링커를 포함하는 바이너리 유틸리티의 집합이다.
GCC(GNU Compiler Collection)
C, C++ 등 여러 언어를 위한 컴파일러이다. 공통 백엔드를 사용해 어셈블러 코드를 만들고, GNU 어셈블러로 넘긴다.
C 라이브러리
POSIX 규격에 기반을 둔 API로 응용 프로그램에서 운영체제 커널로 연결되는 주요 인터페이스이다.
GNU 툴체인 안의 기타 도구들
명령
|
설명
|
addr2line
|
실행 파일 안의 디버그 심볼을 읽어서 프로그램 주소를 파일 이름과 행 번호로 변환한다.
시스템 크래시 리포트에 출력된 주소를 해독할 때 매우 유용하다.
|
ar
|
아카이브 유틸리티는 정적 라이브러리를 만들 때 사용한다.
|
as
|
GNU 어셈블러
|
c++filt
|
C++, 자바 심볼을 복원할 때 사용한다.
|
cpp
|
C의 전처리기로, #include, #define 등의 지시자를 확정할 때 사용한다.
|
elfedit
|
ELF 파일의 ELF 헤더를 업데이트할 때 사용한다.
|
g++
|
GNU C++ 프론트엔드로, 소스 파일이 C++ 코드를 담고 있다고 가정한다.
|
gcc
|
GNU C 프론트엔드로, 소스 파일이 C 코드를 담고 있다고 가정한다.
|
gcov
|
코드 커버리지 도구
|
gdb
|
GNU 디버거
|
ld
|
GNU 링커
|
nm
|
오브젝트 파일의 심볼을 나열한다.
|
objcopy
|
오브젝트 파일을 복사하고 번역할 때 쓰인다.
|
ranlib
|
정적 라이브러리 안의 인덱스를 만들거나 수정해 링크 단계를 더 빠르게 한다.
|
readelf
|
ELF 오브젝트 형식의 파일에 정보를 출력한다.
|
size
|
섹션 크기와 전체 크기를 나열한다.
|
strings
|
파일 안의 인쇄 가능 문자열들을 출력한다.
|
stirp
|
오브젝트 파일의 디버그 심볼 테이블을 없애 파일 크기를 줄여준다. 흔히 타깃에 복사할 모든 실행 코드에 적용한다.
|
툴체인의 종류
툴체인의 종류는 사용자 입장에서 2가지의 툴체인이 있다.
네이티브(native)
툴체인이 만들어내는 프로그램과 같은 종류의 시스템으로, 때로는 실제로 같은 시스템에서 실행된다.
예를 들어, ARM을 사용하는 라즈베리 파이와 같이 자체적으로 컴파일 할 수 있는 네이티브 컴파일러를 갖고 있다.
크로스(cross)
툴체인이 타깃 기계와 다른 종류의 시스템에서 실행된다.
예를 들어 상대적으로 속도가 빠른 데스크톱 PC에서 개발 후 임베디드 장치에 로드해서 사용할 수 있다.
거의 모든 임베디드 리눅스 개발은 크로스 개발 툴체인을 사용해 이루어진다. 부분적으로는 대부분의 임베디드 장치가
연산 능력, 메모리 저장 공간이 부족해서 프로그램 개발에 적합하지 않기 때문이지만, 호스트와 타깃 환경을 분리할 수 있기 때문이다.
툴체인은 타겟 CPU의 특징에 따라 빌드방식이 다르므로, 특징에 맞게 빌드 되어야 한다.
CPU 아키텍처
ARM, MIPS, x86_64 등 각 CPU 마다 아키텍처 방식이 다르다.
엔디안 방식
빅 엔디안(big-endian) 과 리틀엔디안(little-endian) 은 기계어 코드가 각각 다르다.
부동소수점 지원
모든 버전의 임베디드 프로세서가 하드웨어 부동소수점 장치를 구현하지 않는다.
이 경우 툴체인은 대신에 소프트웨어 부동소수점 라이브러리를 부르도록 설정될 수 있다.
ABI(Application Binary Interface)
함수 호출 간에 인자를 넘기는 호출 규칙이다.
크로스 개발 툴체인의 방법은 몇 가지 방법이 있다.
1. 미리 빌드된 툴체인 중 필요사항을 만족하는 툴체인을 찾는 방법
2. 임베디드 빌드 도구를 통해 생성된 것을 사용하는 방법
3. 직접 만드는 방법
보통 1번의 미리 빌드된 툴체인을 사용하는 방식이 많다. 미리 빌드된 크로스 툴체인은 보통
SoC나 보드 벤더들이 지원한다. 대부분의 벤더는 리눅스 툴체인을 지원한다.
또는 멘토 그래픽스, 타임시스, 몬타비스타 등 서드파티 리눅스 툴 벤더들이 지원하기도 하고,
개인, 여러 조직들이 미리 빌드된 툴체인을 지원한다.
Buildroot나 Yocto 프로젝트 같은 빌드 시스템을 쓰는 것도 가능하다. 빌드 과정의 일부로 툴체인을 만들어 준다.
'Embedded > 이론' 카테고리의 다른 글
[Embedded] 부트 로더(Boot loader) (0) | 2022.11.15 |
---|---|
[Embedded] 임베디드 리눅스란 (0) | 2022.11.15 |
[Embedded] 상태 레지스터 구조 (0) | 2022.11.15 |
[Embedded] ARM 구성 레지스터 (0) | 2022.11.15 |
[Embedded] ARM 동작 모드와 레지스터 (0) | 2022.11.15 |