Bosh sahifa Wiki Shared Object

Shared Object

Shared Object — bir nechta executable yoki runtime component tomonidan xotirada ulashilishi va dynamic linker orqali bog‘lanishi mumkin bo‘lgan binary kutubxona. Unixga o‘xshash tizimlarda ko‘pincha .so fayli va ELF formatida uchraydi.

Xotirada ulashish

Shared object position-independent code ishlatib turli processlarda turli virtual base manzilga map qilinadi. Read-only code sahifalari physical memoryda ulashilishi mumkin, writable data esa copy-on-write yoki processga xos bo‘ladi.

Versiyalash

Dynamic symbol table exported va imported nomlarni saqlaydi. SONAME compatibility identifikatori, fayl nomidagi to‘liq version esa release’ni bildiradi. Symlinklar development va runtime nomlarini bog‘laydi. ABI incompatible o‘zgarishda major SONAME yangilanadi.

Dynamic symbol

Relocation GOT va PLT orqali data hamda function reference’larni to‘g‘rilaydi. -Bsymbolic, hidden visibility yoki symbol versioning lookup va interpositionni o‘zgartiradi. Export surface kichik bo‘lsa load time va collision xavfi kamayadi.

Boshlang‘ich kod

Library initialization constructorlar dependency tartibida ishlashi mumkin. Global initialization orderga tayanish nozik; thread va loader lock ichida murakkab ish deadlock yaratishi ehtimol. Public API explicit initializationni afzal ko‘rishi mumkin.

Yangilash

Shared object update diskdagi faylni almashtirish bilan ishlayotgan process code’ini xavfsiz yangilamaydi; yangi process yangi versionni oladi. Plugin unload paytida function pointer, TLS va obyekt ownershipi tugagan bo‘lishi kerak.

ABI testi

Tekshiruv exported ABI ro‘yxati, required symbol version, relocation va dependency closure’ni ko‘radi. Eski consumer executable yangi shared object bilan qayta kompilyatsiyasiz ishlatiladi.

Shared object buildida default visibilityni yashirish va faqat public export mapni ochish API yuzasini barqarorlashtiradi. Release tekshiruvi tasodifiy yangi global symbolni ABI qo‘shilishi sifatida ko‘rsatadi.

+## Amaliy boshqaruv

Shared Object xavfsizligi faqat happy-path bilan baholanmaydi. GOT/PLT, visibility va constructor lifecycle atrofidagi limitlar, noto‘g‘ri format va parallel bajarilish holatlari oldindan sinovga kiritiladi. Parser yoki runtime katta qiymatlarda integer overflow, cheksiz recursion va xotira o‘sishidan himoyalanadi. Ishonchsiz kirish diagnostic matn orqali terminal escape yoki maxfiy pathni chiqarib yubormasligi ham nazorat qilinadi.

Muhim xato sinfi — ABI break yoki unload qilingan code’ga callback. Bunday holatda vosita optimistik taxmin bilan davom etmaydi: zarur bo‘lsa sekinroq, lekin xavfsiz yo‘l tanlanadi yoki aniq diagnostika bilan jarayon to‘xtatiladi. Xatoni qayta ishlab bo‘ladigan qilish uchun target, optionlar, kirish identifikatori va tegishli metadata qayd etiladi. Foydalanuvchi ma’lumoti xom shaklda loglanmaydi; hash, build-id yoki cheklangan kontekst yetarli bo‘lgan joyda shular ishlatiladi.

Sifat nazorati eski consumer, export list va loader integration testi orqali bajariladi. Testlar normal misol bilan cheklanmay, bo‘sh kirish, minimal va maksimal o‘lcham, mos kelmaydigan versiya, yo‘qolgan komponent hamda parallel holatlarni qamraydi. Natijaning to‘g‘riligi performance o‘lchovidan alohida baholanadi. Keyin vaqt, xotira, artefakt hajmi yoki runtime kechikishi kabi mavzuga mos metrikalar baseline bilan solishtiriladi. Regressiya topilsa, minimal takrorlanuvchi holat saqlanib, keyingi release uchun doimiy testga aylantiriladi.

Library dependencylari minimal version bilan yoziladi; build mashinasidagi tasodifiy yangi symbol release’da yashirin talabga aylanmasligi uchun oldingi supported sysroot bilan link testi bajariladi. --no-undefined kabi rejim unresolved reference’ni build vaqtida topishga yordam beradi.

Bog‘liq tushunchalar

dynamic linker, shared library, SONAME, symbol versioning, position-independent code, ABI