2. ABI란?
• 응용 프로그램과 운영체제, 응용 프로그램과 라이브러리 사이에
필요한 저 수준 인터페이스를 정의한다
응용 프로그램운영체제 라이브러리
3. ABI란?
• API랑 똑같은 거 아냐?
• 하지만 API보다 ABI가 저수준(binary)이라는 것
• API는 소스 코드에서 사용되고 ABI는 바이너리에서 호환이 된다
• 아키텍처와 운영체제마다 조금씩 차이가 있다
• 윈도 98에서 돌아가던 게 XP에서도 돌아가는 이유는 MS에서 ABI를 지
원하기 때문이다
• 함수 호출 규약을 정의한다
4. ABI란?
• 외부 라이브러리를 사용할 때 중요하다
• 만약 A라는 라이브러리를 사용하고 있을 때 업데이트된 A라이브
러리가 배포되었다.
• 외부 라이브러리가 업데이트 됐다고 전체 프로젝트를 다시 컴파일 하고
싶은가?
• 만약 업데이트된 라이브러리도 같은 ABI를 지원한다면 프로그램을 변경
하지 않아도 잘 돌아간다
• 서로 다른 버전의 두 라이브러리가 같은 ABI를 가지고 있을 때 “binary-
compatible”하다
• 같은 저수준 인터페이스를 가진다는 말
5. ABI가 바뀌면 컴파일 또 해야 된다
• 간혹 ABI 변경을 피할 수 없을 때도 있다
• 그럼 뭐 컴파일 다시 하는 거지…
• ABI는 바뀌었는데 API는 그대로인 경우도 있다
• 이걸 “source compatible”하다고 함
• 근데 이거만 가지고는 동작 보장이 안되기 때문에 ABI가 바뀌면 컴파일
을 다시 해야만 함
6. ABI를 변경하지 않으려면?
• 이런저런 이유로 ABI가 변경되지 않는 쪽이 바람직하다
• 함수 인터페이스를 바꾸면 안 된다
• 리턴 타입, 매개변수 숫자나 타입 등등
• 자료형 정의나 구조체 정의, 상수 정의 등도 바뀌면 안 된다
• 새 함수나 자료형이 추가되는 것은 가능하다
7. ABI는 어떻게 제공되는가?
• ABI는 명시적으로 제공될 필요가 없다
• 사람들이 어셈블리로 코딩한다면(!) 이야기가 달라지지만…
• ABI는 특정 언어에 의존적이지 않다.
• C언어랑 PASCAL 프로그램도 컴파일 되면 같은 ABI를 쓸 수 있다
8. 결론
• ABI는 calling convention을 다룬다
• ABI 호환성을 유지하면 라이브러리 유지 / 보수가 편해진다
• ABI 호환성을 유지하려면 추가 외에 기존의 라이브러리 값을 함
부로 바꾸면 안 된다
• ABI 호환성이 깨졌을 경우는 re-compile하면 된다