Bosh sahifa Wiki Dynamic linking

Dynamic linking

Dynamic linking — dastur foydalanadigan kutubxona kodini executable ichiga to‘liq ko‘chirmasdan, shared library bilan yuklash yoki bajarilish vaqtida bog‘lash usulidir. Executable tashqi symbollar va kerakli kutubxonalar haqidagi yozuvlarni saqlaydi. Dynamic loader jarayon ishga tushganda yoki dastur talab qilganda mos modullarni xotiraga xaritalab, murojaatlarni hal qiladi.

Statik linklashdan farqi

Statik linklashda zarur obyekt kodi yakuniy binarga qo‘shiladi. Bu deployni mustaqilroq qiladi, lekin bir nechta jarayon bir xil kodning alohida nusxasini diskda saqlashi va yangilanish uchun qayta link talab qilishi mumkin. Dynamic linkingda kutubxonaning read-only kod sahifalari bir nechta jarayon orasida ulashilishi mumkin va xavfsizlik yangilanishi ba’zan ilovani qayta build qilmasdan o‘rnatiladi.

Buning evaziga runtime dependency paydo bo‘ladi. Kerakli kutubxona topilmasa, versiya yoki ABI mos bo‘lmasa, dastur ishga tushmasligi yoki nozik xato ishlashi mumkin. Paket menejeri dependency versiyalari va loader qidiruv yo‘llarini boshqaradi. Faqat fayl nomining mosligi binar interfeys mosligini kafolatlamaydi.

Symbol bog‘lash

Executable va shared object dynamic symbol table orqali eksport hamda importlarni bildiradi. Loader undefined symbol uchun ta’rif qidiradi va relocationlarni bajaradi. Eager binding barcha funksiyalarni boshlanishda hal qiladi; lazy binding esa ayrim chaqiruvlarni birinchi ishlatilganda bog‘laydi. Lazy usul startupni tezlashtirishi mumkin, ammo yetishmayotgan symbol xatosi kechroq paydo bo‘ladi.

GOT ma’lumot va funksiya manzillariga bilvosita kirishni ta’minlaydi, PLT esa tashqi funksiyalar chaqiruvini resolver bilan bog‘laydi. Position-independent code shared libraryni turli virtual manzillarga ko‘chirishni yengillashtiradi va kod sahifalariga yoziladigan relocationlarni kamaytiradi.

Yuklash va xavfsizlik

Dastur pluginni nom yoki yo‘l bo‘yicha dlopen singari API bilan keyinroq yuklashi mumkin. Plugin interfeysi versiyalanadi, kerakli symbol va imkoniyatlar tekshiriladi. Modulni unload qilish qiyin: uning funksiyasida ishlayotgan oqim, saqlangan callback yoki obyekt qolsa, kod xotiradan chiqarilgach invalid murojaat yuz beradi.

Kutubxona qidiruv yo‘li ishonchsiz katalogni ustun qo‘ysa, hujumchi soxta modul yuklatishi mumkin. Absolute yoki xavfsiz konfiguratsiyalangan yo‘l, imzo va paket yaxlitligi tekshiruvi qo‘llanadi. Environment variable orqali loader xulqini o‘zgartirish privileged jarayonlarda cheklanadi. RELRO, symbol visibility va minimal eksport ham hujum yuzasini kamaytiradi.

+## Versiyalash va deploy

Shared library yangilanishi source compatibility bilan cheklanmaydi; struct layout, calling convention, symbol turi va exception modeli kabi ABI elementlari saqlanishi kerak. SONAME yoki unga teng identifikator mos ABI oilasini bildiradi. Buzuvchi o‘zgarish yangi major nom bilan parallel o‘rnatiladi. Container va hermetic build kerakli kutubxona nusxasini artefakt bilan birga pin qilib, hostdagi tasodifiy yangilanishdan ajratadi. Security patch bir kutubxonani almashtirganda ishlayotgan jarayon eski mapped inode’dan foydalanishda davom etishi mumkin, shuning uchun servislar rejalashtirilgan restart orqali yangi kodni yuklaydi. Deploy testi barcha runtime dependency va symbol versiyalarini toza muhitda tekshiradi.

Dynamic library bilan static runtime aralashganda allocator yoki global state’ning ikki nusxasi paydo bo‘lishi mumkin. Bir modul ajratgan xotirani boshqa runtime nusxasi bo‘shatsa xato yuz beradi. Ownership chegarasi va qaysi tomon allocate/free qilishi ABI hujjatida belgilanadi.

Kutubxona almashtirilgach smoke test asosiy import va chaqiruvlarni tekshiradi.

Bog‘liq tushunchalar

Shared library, Dynamic loader, Symbol resolution, ABI, Relocation, GOT, PLT