Posts ABI Standards
Post
Cancel

ABI Standards

ABI(Application Binary Interface) 표준

Application간 binary 데이터를 어떻게 교환해야 하는지 다음과 같은 규칙들을 정한다.

  • 데이터 타입과 정렬 방법
  • 함수 호출 시 인수 및 결과에 대해 레지스터 교환 방법
  • 시스템 콜 호출 방법
  • 프로그램 코드의 시작과 데이터에 대한 초기화 방법
  • 파일 교환 방법(ELF 등)

EABI 표준

EABI(Embeded ABI)는 임베디드 환경의 ABI를 다룬다. ARM 아키텍처에서 리눅스 버전에 따라 ABI를 사용하는 방식이 다음 두 가지로 나뉜다.

  • arm/OABI
    • 커널 v2.6.15 (mainline v2.6.16) 이전에 사용되던 ABI 방식(Old ABI 또는 legacy ABI라고도 불린다)
    • glibc 2.3.6 까지 사용
    • gcc: linux-arm-none-gnu
  • arm/EABI
    • 커널 v2.6.16 부터 사용되는 ARM EABI 방식
    • glibc v2.3.7 및 v2.4 부터 사용
    • gcc: linux-arm-none-gnueabi

arm/OABI 및 arm/EABI 차이점

소프트 인터럽트 호출방식

  • OABI
    • swi __NR_SYSCALL_BASE(==0x900000)+1
  • EABI
    • mov r7, #1 (시스템콜 인덱스)
    • swi 0

구조체 패키징

  • OABI
    • 구조체는 4 바이트 단위로 정렬
  • EABI
    • 구조체 사이즈대로 사용

스택에 인수 정렬

  • OABI
    • 스택에 저장할 때 4 바이트 단위로 저장
  • EABI
    • 스택에 저장할 때 8 바이트 단위로 저장

64bit 타입 인수 정렬

  • OABI
    • 4 바이트 단위로 정렬
  • EABI
    • 8 바이트 단위로 정렬

Enum 타입 사이즈

  • OABI
    • 4 바이트 단위
  • EABI
    • 가변으로 지정할 수 있음

인수 전달 시 레지스터 수

  • OABI
    • 4개 (r0~r3)
  • EABI
    • 7개(r0~r6)

차이점 예제

소프트 인터럽트 + 64bit 타입 인수 정렬

예) long sum64(unsigned int start, size_t size);   syscall no=100

  • arm/OABI
    • r0에 start 대입
    • r1과 r2에 size를 64비트로 대입
    • swi #(0x900000 + 100)
  • arm/EABI
    • r0에 start 대입
    • r2와 r3에 size를 64비트로 대입
    • r7에 100 대입
    • swi 0
This post is licensed under CC BY 4.0 by the author.