Bosh sahifa Wiki Dynamic library

Dynamic library

Dynamic library — dastur bajarilayotgan muhitda alohida fayl sifatida saqlanadigan va uning kodi bir yoki bir nechta jarayonga yuklanadigan kompilyatsiyalangan kutubxonadir. Linux va boshqa Unix tizimlarida bunday fayl ko‘pincha .so, macOSda .dylib, Windowsda esa .dll kengaytmasiga ega. Dastur kutubxonadagi funksiyalarni ishlatadi, ammo ularning mashina kodi odatda executable ichiga to‘liq ko‘chirilmaydi.

Bog‘lash bosqichlari

Dinamik kutubxona ikki usulda bog‘lanadi. Load-time linkingda executable ichidagi dependency yozuvlari asosida operatsion tizim yuklagichi kutubxonani dastur ishga tushishidan oldin topadi. Runtime loadingda dastur dlopen yoki LoadLibrary kabi API orqali kerakli faylni keyinroq ochadi va symbol manzilini nom bo‘yicha oladi. Ikkinchi usul plugin tizimlari uchun qulay, lekin xatolar kompilyatsiya vaqtida emas, bajarilish vaqtida ko‘rinishi mumkin.

Linker build vaqtida chaqirilgan symbolning qaysi kutubxonada ekanini qayd etadi. Loader esa jarayon boshlanganda uning haqiqiy manzilini aniqlaydi, relocationlarni bajaradi va zarur kod sahifalarini virtual xotiraga xaritalaydi. Position-independent code kutubxonani turli manzillarga joylashtirishni osonlashtiradi.

Versiya va ABI

Kutubxonaning public funksiyalari, ma’lumot turlari, calling convention va object joylashuvi uning ABI qismini tashkil qiladi. Funksiya nomi o‘zgarmasa ham parametr turi yoki struktura maydonlarining tartibi o‘zgarsa, eski dastur yangi kutubxona bilan ishlamasligi mumkin. Shuning uchun platformalar soname, install name yoki DLL nomi orqali moslik chegarasini bildiradi.

Semantic version faqat odamlarga tushunarli release belgisi bo‘lishi mumkin; loader esa odatda fayl nomi va binary metadata bilan ishlaydi. Distribution paketlari bir major ABI uchun symbolic linklar yaratadi. ABI buzilganda yangi major soname berish eski va yangi kutubxonalarni yonma-yon o‘rnatish imkonini beradi.

Xotira va yangilash

Bir xil kutubxonadan foydalanuvchi jarayonlar uning faqat o‘qiladigan kod sahifalarini fizik xotirada bo‘lishishi mumkin. Bu ko‘p dastur bir xil komponentdan foydalanganda xotira va disk sarfini kamaytiradi. Har jarayonning o‘zgaruvchan global ma’lumotlari esa odatda alohida sahifalarda saqlanadi.

Xavfsizlik tuzatishini bitta kutubxona paketida tarqatish bir nechta dasturga foyda beradi. Biroq allaqachon ishlayotgan jarayon eski xaritalangan kodni qayta ishga tushirilguncha ishlatishi mumkin. Yangilanish ABI mos bo‘lmasa, dasturlar ishga tushmaydi yoki noaniq xato beradi; shuning uchun package dependency, smoke test va rollback muhim.

Qidiruv va xavfsizlik

Loader kutubxonani executable metadata, tizim kataloglari, konfiguratsiya va ayrim muhit o‘zgaruvchilari bo‘yicha qidiradi. Nazoratsiz katalogni qidiruv yo‘liga oldin qo‘yish zararli faylning qonuniy kutubxona o‘rnida yuklanishiga olib kelishi mumkin. Privileged dasturlarda qidiruv yo‘li qat’iy cheklanadi, fayl egaligi va imzosi tekshiriladi.

Runtime plugin yuklashda kutilgan interfeys versiyasi, symbol mavjudligi va xato kodi tekshiriladi. Kutubxonani jarayon davomida unload qilish xavfli bo‘lishi mumkin: boshqa thread uning funksiyasida turgan yoki callback manzilini saqlagan bo‘lsa, kod sahifasi bekor qilingach yaroqsiz manzil qoladi.

Static library bilan farqi

Static library kodi link vaqtida yakuniy artefaktga kiradi; dynamic library esa deploy muhitida alohida dependency bo‘lib qoladi. Statik yondashuv bitta faylli tarqatishni soddalashtiradi, dinamik yondashuv esa umumiy kodni bo‘lishish va mustaqil yangilashga imkon beradi. Tanlov binary hajmi, platforma siyosati, litsenziya, xavfsizlik yangilanishlari va ABI boshqaruviga bog‘liq.

Bog‘liq tushunchalar

Static library, Dynamic linker, ABI, Position-independent code, Symbol resolution, Shared object, Plugin