본문 바로가기

연구 노트/Embedded

ABI, EABI 그 의미를 이해하고 툴 체인 이름까지 해석하기

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?