카테고리

asm (27) bootloader_x86_grub (1) C (92) compile (11) config (76) CPP (13) CSS (1) debugging (7) gimp (1) Go (1) html (1) Java (1) JavaScript (1) kernel (19) LibreOffice (3) Linux system progamming (21) MFC (1) opencv (4) OpenGL (1) PHP (1) Python (4) qemu (29) shell (3) socket (7) troubleshooting (2) ubuntu18.04 (2) windows (1)

2019/01/20

ABI 어플리케이션 바이너리 인터페이스

어플리케이선 바이너리 인터페이스(ABI Application Binary Interface) 
어셈블리와 OS 레벨에서의 작동 방식을 아는 경우 특정 ABI를 준수. 
ABI는 매개 변수가 전달되는 방식, 반환 값이 배치되는 방식 등을 관리함. 많은 플랫폼에서 선택할 수있는 ABI는 단 하나뿐. 
응용 프로그램과 운영체제, 응용 프로그램과 라이브러리 사이에 필요한 저 수준 인터페이스를 정의한다 응용 프로그램운영체제 라이브러리.

API보다 ABI가 저수준(binary) 라이브러리. 
API는 소스 코드에서 사용되고 ABI는 바이너리에서 호환된다.
아키텍처(x86, amd64, arm) 운영체제마다 조금씩 차이가 있음.
윈도우즈 계열 운영 체제(xp, windows7) 실행 파일 ABI를 지원 하기 때문.
함수 호출 규약 정의 함. 

외부 라이브러리를 사용할 때 중요 
- 만약 A라는 라이브러리를 사용하고 있을 때 업데이트된 A 라이브러리가 배포
- 외부 라이브러리가 업데이트 됐다고 전체 프로젝트를 다시 컴파일 하는 것을 방지 
- 만약 업데이트된 라이브러리도 같은 ABI를 지원할 경우 프로그램은 동작 함 
- 서로 다른 버전의 두 라이브러리가 같은 ABI를 가지고 있을 때 “binary- compatible 동일한 인터페이스를 가진다.

ABI가 바뀌면 재 컴파일 필요
ABI는 변경 되었지만 API는 그대로인 경우(“source compatible”)
동작 보장을 못함, ABI 변경시 재 컴파일 하는게 정석

ABI를 변경하지 않으려면? 
- ABI 변경 되지 않도록 유지 해야함. 
- 함수 인터페이스 변경 금지 
- 리턴 타입, 매개변수 숫자나 타입 등등 
- 자료형 정의, 구조체 정의, 상수 정의 등변경 금지 
- 새로운 함수, 자료형 추가 가능.

ABI 제공 방법
- ABI 강제적 제공 할 필요 없음.
- 개발자가 어셈블리로 코딩한다면 ABI 제공할 필요가 있음 
- ABI는 특정 언어에 의존적이지 않음. 
- C, PASCAL, CPP 컴파일 되면 같은 ABI 사용 할 수 있음.

ABI는 calling convention(호출 규격). 
- ABI 호환성을 유지 한 다면 라이브러리 유지/보수가 편함 
- ABI 호환성을 유지 방법, 추가 외에 기존의 라이브러리 값 변경 금지 
- ABI 호환성이 깨졌을 경우는 재 컴파일 필요.





툴체인 형식 arm-elf , arm-none-eabi

운영체제 동작.
arm-elf toolchain은 elf 형식 실행을 지원하는 일부 OS 용 obj 코드를 생성합니다 (예 : Linux ABI). OS가 프로그램 실행을 제어합니다.

펌웨어에서 동작. 
arm-none-eabi toolchain은 마이크로 컨트롤러 또는 마이크로 프로세서 (베어 메탈의 경우 EABI 임베디드 ABI)에 대한 obj 코드를 생성합니다. 이 코드는 MC의 클린 플래시에 다운로드되고 MC의 코어는 전원이 켜진 후 실행됩니다. OS 없음, 확장 명령 세트, 공유 모듈 연결 가능성 없음.