ABI — compile qilingan dasturiy komponentlar binary darajada qanday o‘zaro ishlashini belgilaydigan qoidalar to‘plami. Uning to‘liq nomi Application Binary Interface hisoblanadi.
API source code darajasidagi function, class va protocolni belgilaydi. ABI esa machine code, register, stack, object layout va binary format darajasidagi moslikni belgilaydi.
Bir xil APIga ega ikki library ABI jihatdan mos bo‘lmasligi mumkin.
ABI tarkibidagi qoidalar
ABI odatda quyidagilarni qamrab oladi:
- calling convention;
- register vazifalari;
- argument uzatish;
- return value;
- stack alignment;
- data type hajmi;
- structure layout;
- name mangling;
- exception modeli;
- binary file formati;
- dynamic linking;
- system call interfeysi;
- symbol visibility;
- relocation.
ABI arxitektura, operatsion tizim va compiler bilan bog‘liq.
Calling convention
Function chaqirilganda argumentlar qayerga joylanishi belgilanadi.
Masalan:
- dastlabki argumentlar registerlarda;
- qolganlari stackda;
- return value maxsus registerda;
- qaysi registerlarni caller saqlaydi;
- qaysilarini callee tiklaydi.
Ikki komponent turli calling convention ishlatsa, argumentlar noto‘g‘ri talqin qilinadi.
Stack alignment
Stack pointer function chaqiruvida ma’lum chegaraga tekislangan bo‘lishi kerak.
Masalan, 16 bayt alignment vector instruction va platforma qoidalari uchun talab qilinishi mumkin.
Noto‘g‘ri alignment:
- crash;
- sekin access;
- noto‘g‘ri instruction xatti-harakati
keltirib chiqarishi mumkin.
Data type hajmi
ABI quyidagilar hajmini belgilaydi:
int;long;- pointer;
size_t;wchar_t;- enum;
- boolean.
Masalan, 64-bit platformalarda long hajmi barcha OSda bir xil emas.
Source code compile bo‘lsa ham binary structure boshqa platformada mos kelmasligi mumkin.
Endianness
Ko‘p baytli qiymat byte tartibi ABI va architecture bilan bog‘liq.
- little-endian;
- big-endian.
Binary fayl yoki network protocol endiannessni explicit belgilamasa, platformalararo moslik buziladi.
Network byte order odatda big-endian.
Structure layout
Compiler structure fieldlarini alignment uchun padding bilan joylashtiradi.
Misol:
struct Item {
char flag;
int value;
};
char 1 bayt, int 4 bayt bo‘lsa ham structure 8 bayt bo‘lishi mumkin.
Field order va packing ABIga ta’sir qiladi.
Padding
Padding fieldlar orasiga yoki structure oxiriga qo‘shiladi.
Maqsad — keyingi fieldni kerakli alignmentga joylashtirish.
Binary serializationda structure memorysini to‘g‘ridan-to‘g‘ri yuborish xavfli:
- padding qiymati noma’lum;
- platforma hajmi farq qiladi;
- endianness farq qiladi;
- pointer yuborib bo‘lmaydi.
Name mangling
C++ kabi tillarda function nomiga parameter type va namespace ma’lumoti qo‘shilib binary symbol hosil qilinadi.
Bu overloadni qo‘llaydi.
Turli compiler yoki versiya name manglingni boshqacha bajarishi mumkin.
extern "C" C calling va symbol nomini ishlatishga yordam beradi.
Vtable
Virtual methodli objectlarda compiler vtable va object layout yaratadi.
Vtable tartibi ABI qismi bo‘lishi mumkin.
Classga field yoki virtual method qo‘shish binary compatibility’ni buzishi mumkin.
Exception ABI
Exception bir module’dan boshqasiga o‘tganda:
mos bo‘lishi kerak.
Turli runtime yoki compiler setting orasida exception uzatish xavfli bo‘lishi mumkin.
C interfeysi ko‘pincha exceptionni boundary’dan o‘tkazmaydi.
Binary file formati
Executable va library formati:
- ELF;
- PE;
- Mach-O
kabi bo‘lishi mumkin.
Format quyidagilarni saqlaydi:
- section;
- segment;
- symbol;
- relocation;
- import;
- export;
- debug info;
- entry point.
OS loader shu formatni tushunadi.
Dynamic library ABI
Dastur dynamic library symboliga ulanadi.
Library update binary-compatible bo‘lsa, applicationni qayta compile qilmasdan ishlashi mumkin.
Moslikni buzuvchi o‘zgarishlar:
- function signature o‘zgarishi;
- structure hajmi;
- symbol olib tashlash;
- calling convention;
- exception modeli;
- class layout.
SONAME va version
Unix-like tizimlarda shared library SONAME major ABI versiyasini bildirishi mumkin.
Masalan:
libexample.so.2
ABI buzilsa major version oshiriladi.
Minor update eski symbol va layoutni saqlashi mumkin.
API va ABI
| Jihat | API | ABI |
|---|---|---|
| Daraja | Source code | Binary |
| Asosiy obyekt | Function, class, endpoint | Register, stack, symbol |
| Recompile | Odatda mumkin | Mos bo‘lsa shart emas |
| Til | Source tilga bog‘liq | Platforma va compilerga bog‘liq |
| Hujjat | Header yoki docs | ABI specification |
Source compatibility binary compatibility’ni avtomatik bermaydi.
System call ABI
User process kernelga syscall qilganda:
- syscall raqami;
- argument registerlari;
- return value;
- error kodi;
- instruction
aniq belgilanadi.
OS user-space binarylar uzoq vaqt ishlashi uchun syscall ABI’ni barqaror saqlashga intiladi.
Kernel module ABI
Kernel ichki strukturalari va symbol ABI’si tezroq o‘zgarishi mumkin.
Bir kernel versiyasi uchun build qilingan module boshqa versiyada ishlamasligi mumkin.
Vendor kernel barqaror module ABI taqdim etishi mumkin.
FFI
Foreign Function Interface turli tillar orasida function chaqirishni ta’minlaydi.
FFI odatda C ABI’dan foydalanadi, chunki u sodda va keng qo‘llanadi.
Type mapping, ownership va error handling alohida belgilanadi.
ABI breakni aniqlash
Vositalar eski va yangi library orasida:
farqlarini tekshiradi.
CI’da ABI compatibility test qo‘llanishi mumkin.
Diagnostika
ABI muammosi quyidagi ko‘rinishda chiqishi mumkin:
- symbol not found;
- wrong architecture;
- segmentation fault;
- noto‘g‘ri argument;
- corrupted return value;
- structure field xatosi;
- loader error;
- exception crash.
Tekshiruvda compiler, architecture, calling convention, library version va symbol table ko‘riladi.
Bog‘liq tushunchalar
API, Calling convention, Binary compatibility, Dynamic library, Name mangling, Structure layout, ELF, FFI, System call, Linker