Bosh sahifa Wiki ABI

ABI

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:

  • object representation;
  • stack unwinding;
  • type information;
  • personality function;
  • cleanup

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