ABI와 EABI, 그게 뭐야?
아무 생각 없이 공부 자료를 보다가 문득 'ABI'의 의미를 알아야겠다는 생각이 들었습니다. 이에 대해 알아보고 정리한 자료입니다.
ABI
- 'Application Binary Interface'의 약자입니다.
- 바이너리 수준의 인터페이스 규약을 말합니다.
- 서로 다른 컴파일러가 소스 코드를 컴파일하더라도 오브젝트 파일끼리 링킹이 될 수 있도록 합니다.
EABI
- 임베디드 환경의 ABI를 의미합니다.
- ABI와 EABI의 차이점 이런 것들이 있습니다.
- 권한 명령이 응용 프로그램 코드 안에서 실행됩니다.
- 동적 링크 요구하지 않으며 아예 허용하지 않을 수도 있습니다.
- 메모리 저장을 위해 더 작은 스택 프레임을 가집니다.
- 위에 적힌 차이점 중에서 가장 크게 와닿는 것은 두 번째, '동적 링크 사용 불가'인데요, Windows의
.dll
, Linux의.so
와 같은 동적 라이브러리가 EABI에서는 사용할 수 없게 됩니다.
그럼 NONE-EABI는 뭐지? 툴 체인 이름 규칙을 알자!
제가 사용하고 있는 툴 체인은 NONE-EABI 방식입니다. 빌드할 때마다 사용하는 Makefile 내부를 살펴볼까요?
CC = arm-none-eabi-gcc
AS = arm-none-eabi-as
LD = arm-none-eabi-ld
OC = arm-none-eabi-objcopy
모든 도구들이 none-eabi
방식을 사용하고 있을 것을 알 수 있습니다. 여기서 'none'은 "EABI가 아니다"를 의미하는 것이 아닙니다. 'none'의 의미는 "어떤 벤더(vender)에 특화된 EABI가 아니다"입니다. 특정 툴 체인 회사 전용 바이너리를 생성하지 않는다는 것입니다. 툴 체인 명명 규칙을 보면 조금 더 의미가 선명해질 것입니다.
arch-vendor-(os-)abi
- arch: 타깃 아키텍처
- vendor: 툴 체인 공급사
- os: 타깃 운영체제
- abi: ABI 방식
여기서 os는 생략 가능하다고 합니다. 예를 들어,
arm-none-linux-eabi
이 툴 체인은 ARM 아키텍처에 벤더가 없으며 리눅스 OS에 맞춘 EABI 방식으로 컴파일하는 것임을 알 수 있습니다. 예를 하나 더 보도록 하지요.
x86_64-w64-mingw32
이것은 x86_64(=AMD64) 아키텍처의 w64(=mingw-w64)라는 벤더에 mingw32(=win32 API as seen by GCC) 방식으로 컴파일 할 수 있는 툴 체인이라는 의미입니다.
ABI의 의미를 알아보다가 툴 체인의 명명 규칙까지 이해하게 되었습니다. 이제는 복잡해 보이는 툴 체인 이름도 익숙하게 보이기 시작했고요, 처음 보는 툴 체인이라도 대강 어떤 것인지 알 수 있으니 덜 긴장하게 될 것 같네요.
참고
위키피디아 - 응용 프로그램 이진 인터페이스
Can anyone explain the gcc cross-compiler naming convention?
'연구 노트 > Embedded' 카테고리의 다른 글
GNU 어셈블러와 링커 스크립트 매뉴얼 (0) | 2021.04.22 |
---|---|
[STM32] 레지스터 직접 접근 방식으로 UART 통신 예제 구현하기 (2) | 2021.03.18 |
QEMU 사용시 쉘 종류에 따라서 옵션 값이 달라지는 문제 (0) | 2021.01.20 |
Windows 10에서 RTOS 개발환경 구축하기 3 - WSL 2에서 GUI 프로그램을 실행하기 위한 준비 (2) | 2021.01.17 |
Windows 10에서 RTOS 개발환경 구축하기 2 - 개발 도구 설치하기 (1) | 2021.01.17 |