본문 바로가기

Linux Unix

[ 리눅스 / Linux ] 리눅스 ABI란?

반응형

리눅스 ABI (Application Binary Interface)는 소프트웨어의 바이너리 형식, 함수 호출 규약, 데이터 형식, 운영 체제 서비스에 대한 인터페이스를 정의하여,
응용 프로그램과 운영 체제 또는 다른 소프트웨어 간의 상호 운용성을 보장하는 규칙과 규약의 집합입니다.
이는 소스 코드 레벨이 아닌 바이너리 레벨에서의 호환성을 제공합니다.

1. ABI의 주요 구성 요소

  1. 함수 호출 규약 (Calling Conventions):
    • 함수 인자를 어떻게 전달하고, 함수 호출과 반환 시 어떤 레지스터를 사용하는지 정의합니다.
    • 스택 사용 방식과 호출 후 레지스터 상태도 포함됩니다.
  2. 바이너리 포맷:
    • 실행 파일과 객체 파일의 형식을 정의합니다.
    • 리눅스에서는 ELF (Executable and Linkable Format)가 주로 사용됩니다.
  3. 시스템 콜 인터페이스:
    • 운영 체제 커널이 제공하는 시스템 호출의 번호와 호출 방법을 정의합니다.
    • 시스템 콜은 사용자 공간 애플리케이션이 커널 서비스를 사용할 수 있도록 합니다.
  4. 링킹과 로딩:
    • 동적 및 정적 라이브러리 링크 방법을 정의합니다.
    • 런타임 시 라이브러리 로딩 방법과 관련된 규칙을 포함합니다.
  5. 데이터 타입과 정렬:
    • 기본 데이터 타입의 크기와 정렬을 정의합니다.
    • 구조체의 패딩 방식과 메모리 정렬도 포함됩니다.

2. ABI의 중요성

  • 호환성 보장:
    • 동일한 ABI를 준수하는 바이너리는 다른 시스템에서도 재컴파일 없이 실행될 수 있습니다.
    • 예를 들어, 동일한 리눅스 배포판 내에서 컴파일된 모든 프로그램은 동일한 ABI를 사용하므로 호환성을 유지합니다.
  • 모듈성:
    • 소프트웨어 컴포넌트가 서로 독립적으로 개발되고, 나중에 통합될 수 있습니다.
    • 라이브러리와 애플리케이션 간의 상호 운용성을 보장합니다.
  • 이식성:
    • 소프트웨어가 다양한 하드웨어 아키텍처에서 실행될 수 있도록 합니다.
    • 예를 들어, x86, ARM, MIPS 등의 아키텍처에서 공통 ABI 규칙을 준수하면 호환성을 유지할 수 있습니다.

3. 예제: x86_64 리눅스 ABI

x86_64 아키텍처에서의 리눅스 ABI는 다음과 같은 요소들을 포함합니다:

  • 함수 호출 규약:
    • 첫 여섯 개의 정수 인자는 RDI, RSI, RDX, RCX, R8, R9 레지스터를 통해 전달됩니다.
    • 반환 값은 RAX 레지스터에 저장됩니다.
  • ELF 바이너리 포맷:
    • 실행 파일과 공유 라이브러리는 ELF 형식을 사용합니다.
    • 헤더, 섹션, 세그먼트 등의 구조를 포함합니다.
  • 시스템 콜 인터페이스:
    • 시스템 호출 번호는 RAX 레지스터에 설정됩니다.
    • 시스템 호출 인자는 RDI, RSI, RDX, R10, R8, R9 레지스터에 전달됩니다.
  • 데이터 타입:
    • 정수는 기본적으로 32비트 또는 64비트 크기를 가집니다.
    • 데이터 타입의 정렬은 자연스러운 메모리 경계에 맞춰집니다.

4. ABI와 API의 차이점

  • ABI (Application Binary Interface):
    • 바이너리 수준의 인터페이스를 정의합니다.
    • 소스 코드가 아닌 컴파일된 바이너리 간의 상호 운용성을 보장합니다.
  • API (Application Programming Interface):
    • 소스 코드 수준의 인터페이스를 정의합니다.
    • 함수, 클래스, 메서드 등의 사용 방법을 명시합니다.
    • API는 소스 코드 호환성을 보장하지만, ABI는 바이너리 호환성을 보장합니다.

5. 결론

리눅스 ABI는 응용 프로그램과 운영 체제 또는 다른 소프트웨어 컴포넌트 간의 상호 운용성을 보장하기 위한 중요한 규약입니다.
이를 통해 소프트웨어 모듈은 독립적으로 개발되고, 다양한 환경에서 재컴파일 없이 실행될 수 있습니다.
ABI는 소프트웨어의 이식성과 모듈성을 높여주는 중요한 요소로, 시스템 소프트웨어 개발에서 핵심적인 역할을 합니다.

반응형