응용 프로그램 이진 인터페이스(Application Binary Interface, ABI)는 응용 프로그램과 운영 체제 또는 응용 프로그램과 해당 라이브러리, 마지막으로 응용 프로그램의 구성요소 간에서 사용되는 낮은 수준의 인터페이스이다.
ABI는 API와 다르다, API가 소스 코드에서 사용된다면 ABI는 바이너리에서 호환이 가능하다는 점이 다르다.
from wiki
ABI(Application Binary Interface)응용 프로그램 바이너리 인터페이스
함수 실행 방식, 레지스터 활용, 시스템 콜 실행, 라이브러리 링크 방식 등
ABI가 호환되면 재컴파일 없이 동작
컴파일러, 링커(라이브러리 링크), 툴체인(컴파일러를 만드는 프로그램)에서 제공
API가 동일하면, 하위 호환가능
동일한 API(라이브러리)가 있을 경우 코드 실행가능
ABI가 동일하면,
동일한 실행파일 실행 가능(ABI는 CPU 아키텍처랑 더욱 관련이 있다.)
리눅스 프로그램을 윈도우에서 실행 못하는 이유 또한, ABI가 다르고, 시스템콜(API)가 다르기 때문이다.(fastcampus_강의 설명)
아래 블로그에서는 x86과 같은 아키텍처를 ABI와 유사한 개념으로 설명한다.
리눅스에서 윈도우 실행파일이 실행되지 못하는 이유를 실행파일의 포맷이 다른점과 라이브러리(API)가 다른점이라고 설명한다.
내가 내린 정리!!!
API를 통해서 동일한 소스코드에 대하여서 동일한 기능을 수행하는 실행파일을 생성한다.
소스코드-해당 운영체계 라이브러리(API)-해당 운영체계에 맞는 이진코드 파일
ABI를 통해서 해당 운영체계에 맞는 이진코드는 하드웨어에 상관없이 동일한 기능을 수행한다.
이진코드 파일-해당 하드웨어에 맞는 인터페이스(ABI)-해당 하드웨어에 맞게 수행
ABI는 다음과 같은 모든 명령어 세트에 대해 정의되어야합니다. x86, x86-64, MIPS, ARMv7-A (32 비트), ARMv8-A (64 비트) 등 엔디안, 둘 다 지원되는 경우. -위키백과
리눅스에서 실행가능한 실행파일은 윈도우에서는 실행 불가능하다—API가 달라서 그런거임
소스코드를 운영체계에 상관없이 실행 가능하게 해줌—API
운영체계에 맞는 실행파일을 하드웨어(CPU)에 상관없이 실행하게 해줌-ABI
ABI는 운영체제에서 해당 하드웨어(CPU)에 맞게 함수 실행 방식, 레지스터 활용, 시스템 콜 실행, 라이브러리 링크 방식 등 정의
물론 운영체제마다 API가 다르므로 ABI도 다를 것임
ABI & API 를 표준화(Binary & Code Level에서 호환 가능)POSIX
유닉스 시스템 프로그래밍 인터페이스 표준
IEEE(Institute of Eletronic and Electronics Engineers)에서 표준화 시도
리차드 스톨만(자유 소프트웨어 재단)이 POSIX를 표준화 이름으로 제안
C 언어 표준다양한 C언어 표준
ANSI(American National Standards Institute)에서 ANSI C 표준 정립
리눅스는 POSIX와 ANSI C 지원
시스템 프로그래밍과 버전끊임없이 POSIX, C, C++ 표준 업데이트
끊임없는 소프트웨어 업데이트
프로그래밍 트렌드와 상관없이 시스템 레벨단 기술은 유지되고, 필요하다.
상위 레벨 프로그래밍을 할지라도, 하위 시스템 레벨을 알고 있어야 한다.