리눅스 시스템 프로그래밍 - API 와 ABI

김신·2022년 12월 24일
1
post-thumbnail

0. 호환성

개발자는 프로그램이 잘 작동하기를 바랍니다. 운영체제의 버전에 상관없이 의도한 대로 동작해야 합니다. 이를 호환성이라고 말합니다. 시스템 레벨에서 호환성에 영향을 주는 2가지가 있습니다. 바로 API(application programming interface)와 ABI(application binary interface)입니다. 두 가지 모두 소프트웨어 간의 인터페이스를 말합니다.

1. API (Application Programming Interface)

API는 소프트웨어의 소스 코드 레벨에서 서로 인터페이스 하는 방식을 정의합니다. 쉽게 말하면 소스 코드 끼리 인사하는 방식을 정의한 것입니다. API의 표준 인터페이스는 (표준으로 정의된 인사 방법은) 함수이며 상위 레벨의 소프트웨어에서 하위 레벨의 소프트웨어를 호출(사용)할 수 있습니다.

API 사용의 예는 카카오맵 API를 들 수 있습니다. 지도를 이용한 소프트웨어를 만들고자 하는 개발자는 보통 지도 소프트웨어를 직접 만들지 않습니다. 개발 시간과 비용의 문제 때문이죠. 그렇기 때문에 카카오에서 제공하는 카카오 맵 API를 바탕으로 카카오맵 소프트웨어(하위 레벨)를 자신의 소프트웨어(상위 레벨)에 사용합니다. 그리고 API 표준을 따라 함수의 형태를 소스 코드에서 사용합니다. C 프로그래밍을 할 때 표준 C 라이브러리를 사용하는 방법과 같습니다. 세부적으로 들어가면 차이는 있으나 대부분 비슷하게 사용합니다.

2. ABI (Application Binary Interface)

ABI는 특정 아키텍쳐 간에서 동작에서 동작하는 소프트웨어 간의 바이너리 인터페이스를 말합니다. API가 소스코드 수준에서의 호환성을 보장한다면 ABI는 바이너리 코드 수준에서 소프트웨어 간 상호 동작에 대해서 정의합니다. 그리고 이는 오브젝트 코드를 다시 컴파일하는 수고 없이 같은 ABI를 지원하는 시스템이라면 그 시스템에서는 같은 기능 수행을 보장합니다.

  • 아키텍처: 컴퓨터 시스템의 하드웨어 구조를 말합니다.

ABI는 아키텍처와 밀접한 관계가 있습니다. ABI의 대부분은 특정 레지스터나 어셈블리 명령어 같은 하드웨어에 국한된 개념을 다루고 있습니다. 따라서 아키텍처가 달라진다면 그 아키텍처에 따른 고유의 ABI를 가지고 있습니다.

다른 수준의 ABI를 살펴봅시다. OS에서는 하드웨어 혹은 시스템 프로그램에 특정한 방식의 format을 갖추기를 기대합니다. 예를 들자면, binary의 first section에 특정한 메모리 offset 정보를 가지고 있는 ELF header를 이용하는 경우이다. 이렇게 정해진 format이 있기 때문에 Window App이 Linux machine에서 실행할 수 없는 것이다.

시스템 프로그램이나 그 상위 레벨의 소프트웨어를 다루는 프로그래라면 ABI에 관해 자세히 알 필요는 없습니다. 그러나 ABI에 대한 지식이 있다면 프로그램을 좀 더 최적화할 수 있습니다.

0개의 댓글