Symbol — kompilyator, assembler va linkerda funksiya, global obyekt, bo‘lim yoki boshqa manzilli elementni bildiradigan nomli yozuvdir. Symbol inson o‘qiydigan identifikatorni kod yoki ma’lumotning joyi bilan bog‘laydi. Kompilyatsiyaning turli bosqichlarida uning aniq atributlari o‘zgaradi, ammo asosiy vazifasi modullar orasida murojaatlarni aniqlashdir.
Symbol table tarkibi
Obyekt fayldagi symbol table odatda nom, qiymat yoki offset, hajm, tur, bog‘lanish darajasi, visibility va tegishli sectionni saqlaydi. Funksiya symboli text bo‘limidagi kodni, object symboli data yoki BSSdagi qiymatni ko‘rsatishi mumkin. Undefined symbol joriy obyekt uni ishlatishini, ta’rifi esa boshqa obyekt yoki kutubxonadan kelishini bildiradi.
Local symbol fayl tashqarisidan bog‘lanmaydi. Global symbol boshqa modullar tomonidan topilishi mumkin. Weak symbol kuchli global ta’rif bo‘lmasa ishlatiladigan standart ta’rif yoki ixtiyoriy bog‘lanish yaratadi. Platforma qoidalariga qarab bir nechta kuchli ta’rif linker xatosiga olib keladi, weak va strong ta’rif uchrashganda esa strong tanlanadi.
Nomlar va visibility
C++ kabi tillarda bir xil funksiya nomi turli parametrlar bilan overload qilinadi. Linker farqlashi uchun compiler name mangling orqali nomga namespace, sinf va tur ma’lumotini kodlaydi. Turli kompilyator yoki versiyalar bir xil ABI sxemasiga amal qilmasa, manba darajasida o‘xshash nomlar binar darajada mos kelmaydi. extern "C" kabi mexanizm ayrim interfeyslarda soddaroq C bog‘lanish nomini tanlaydi.
Visibility eksport doirasini cheklaydi. Shared library faqat ommaviy API symbollarini tashqariga chiqarsa, ichki amalga oshirish nomlari to‘qnashuvi kamayadi va linker optimizatsiyasi yaxshilanadi. Versioned symbol kutubxonaning bir necha ABI variantini saqlashga yordam berishi mumkin. Biroq eksport qilingan symbolni o‘zgartirish mavjud binar mijozlar bilan moslikni buzishi ehtimol.
Linklash va diagnostika
Linker har bir undefined murojaat uchun mos ta’rifni qidiradi, bog‘lanish qoidalarini qo‘llaydi va relocation qiymatini hisoblaydi. “Undefined symbol” xatosi kerakli obyekt kiritilmaganini, kutubxona tartibi yoki nom mangling mos emasligini ko‘rsatishi mumkin. “Duplicate symbol” esa bir nomning ruxsat etilmagan bir nechta ta’rifiga ishora qiladi.
Dynamic linkingda dynamic symbol table va import/export yozuvlari loaderga runtime’da manzil topish imkonini beradi. Symbol interposition ayrim platformalarda bir ta’rifni boshqasi bilan almashtirishi mumkin; bu diagnostika uchun foydali, lekin kutilmagan xulq va xavfsizlik xavfini ham yaratadi.
Debug symbol tushunchasi bog‘lash symbolidan kengroq bo‘lib, lokal o‘zgaruvchi, tur va manba qatori haqidagi ma’lumotni ham qamrab oladi. Release binardan bunday ma’lumot ajratilsa, ishlab chiqarish fayli kichrayadi, lekin crash manzillarini o‘qish uchun aynan shu buildga mos symbol fayli saqlanishi kerak.
Symbolni olib tashlash
strip vositasi yakuniy binardan bog‘lash uchun endi kerak bo‘lmagan symbol va debug bo‘limlarini olib tashlab, fayl hajmini kamaytiradi. Dynamic loaderga zarur eksportlar esa saqlanadi. To‘liq stripped binarni tahlil qilish qiyinroq, chunki funksiya nomlari va manba bog‘lanishi yo‘qoladi; bu xavfsizlik chorasi sifatida yetarli emas, chunki mashina kodi va xulq saqlanib qoladi. Ishlab chiqarish crashlarini symbolicate qilish uchun alohida debug fayl xavfsiz artefakt omborida build ID bilan saqlanadi. Noto‘g‘ri versiyadagi symbol fayli manzillarni yolg‘on funksiya yoki qatorga bog‘lashi mumkin.
Bog‘liq tushunchalar
Symbol table, Linker, Name mangling, ABI, Object file, Dynamic linking, Debug symbol