Object file — kompilyator yoki assembler yaratadigan, mashina kodi va ma’lumotlar bilan birga symbol, relocation hamda boshqa metama’lumotlarni saqlovchi binar fayldir. U ko‘pincha yakuniy bajariladigan dastur emas, linker uchun kirish materiali bo‘ladi. Ayrim formatlar relocatable obyekt, executable va shared libraryni bir umumiy tuzilmaning variantlari sifatida ifodalaydi.
Bo‘limlar va segmentlar
Obyekt fayl mantiqiy bo‘limlarga ajratiladi. Text bo‘limida bajariladigan ko‘rsatmalar, read-only data’da o‘zgarmas qiymatlar, data’da boshlang‘ich qiymatli global obyektlar saqlanadi. BSS boshlang‘ich qiymati nol bo‘lgan xotira hajmini tasvirlaydi va faylda barcha nol baytlarni saqlashni talab qilmaydi. Debug va exception unwind ma’lumotlari uchun alohida bo‘limlar bo‘lishi mumkin.
Section linker nuqtayi nazaridagi tashkilot, segment esa loader xotiraga qanday xaritalashiga yaqin tushunchadir. Yakuniy executable’da bir necha section bir xil ruxsatli segmentga birlashtirilishi mumkin. Kod sahifalarining yozilmaydigan va ma’lumot sahifalarining bajarilmaydigan qilib xaritalanishi xavfsizlik uchun muhim.
Symbol va relocation
Symbol table funksiya yoki obyekt nomini uning bo‘limdagi joyi, hajmi, turi va bog‘lanish xususiyati bilan bog‘laydi. Mahalliy symbol faqat fayl ichida, global symbol boshqa obyektlardan ham ko‘rinishi mumkin. Undefined symbol joriy faylda ishlatiladi, lekin ta’rifi boshqa obyekt yoki kutubxonadan topilishi kerak.
Kompilyatsiya paytida yakuniy manzillar noma’lum bo‘lgani uchun kod va ma’lumotdagi ayrim joylar relocation yozuvi bilan belgilanadi. Yozuv qaysi offsetdagi qiymat, qaysi symbol va qanday formula bilan tuzatilishini bildiradi. Linker bo‘limlarni joylashtirgach shu tuzatishlarni bajaradi. Position-independent kod ayrim runtime relocationlarni kamaytiradi, ammo tashqi nomlar uchun GOT yoki PLT kabi mexanizmlar ishlatilishi mumkin.
Formatlar va vositalar
Unixga o‘xshash ko‘p tizimlarda ELF, Windows ekotizimida COFF/PE, Apple platformalarida Mach-O oilasi qo‘llanadi. Formatlarning maqsadi o‘xshash bo‘lsa-da, sarlavha, relocation turi, symbol ko‘rinishi va platforma metama’lumoti farq qiladi. Fayl kengaytmasi ham platformaga bog‘liq.
Obyekt faylni ko‘ruvchi vositalar sectionlar, symbollar, importlar va relocationlarni ro‘yxatlaydi. Disassembler text bo‘limini assemblyga aylantiradi. Debugger esa debug ma’lumotdan mashina manzilini manba qatoriga bog‘lash uchun foydalanadi. Release buildda debug symbol alohida faylga ajratilishi mumkin; crash tahlili uchun build identifikatori orqali aynan mos symbol to‘plami topiladi.
Obyekt formatini tushunish linker xatolari, takroriy symbol, ABI nomuvofiqligi, binar hajm va dinamik kutubxona muammolarini tahlil qilishga yordam beradi. Binar fayl ishonchsiz manbadan kelsa, uni parserda ochish ham xavfsizlik riski bo‘lishi mumkin; tahlil vositalari yangilanadi va cheklangan muhitda ishlatiladi.
Arxiv kutubxonalari
Statik kutubxona ko‘pincha bir nechta relocatable object faylni indeks bilan bir arxivga jamlaydi. Linker butun arxivni ko‘r-ko‘rona qo‘shmay, hozirgi unresolved symbollarni ta’riflaydigan a’zolarni tanlaydi. Shu sababli ayrim linkerlar uchun kutubxonalar buyruq satridagi tartibi natijaga ta’sir qiladi. Link-time optimizationda obyekt fayl odatiy mashina kodi bilan birga yoki uning o‘rniga compiler IR saqlashi mumkin; yakuniy optimizatsiya barcha modullar ko‘ringanda bajariladi. Bu build vaqtini oshiradi, lekin modul chegarasidan o‘tuvchi inlining va o‘lik kodni olib tashlash imkonini beradi.
COMDAT yoki unga teng mexanizm bir xil generik funksiya bir nechta modulda hosil bo‘lganda linkerni bitta nusxani tanlashga yo‘naltiradi. Section garbage collection esa kirish nuqtalaridan yetib bo‘lmaydigan funksiya va ma’lumot bo‘limlarini olib tashlab, yakuniy binarni kichraytiradi.
Bog‘liq tushunchalar
Compiler, Assembler, Symbol table, Relocation, Linker, ELF, Executable