Executable — operatsion tizim yoki maxsus runtime tomonidan yuklanib, bajarilishi mumkin bo‘lgan dastur fayli. U machine code, bytecode, script yoki boshqa bajariladigan formatda bo‘lishi mumkin.
Kundalik ishlatishda executable ko‘pincha compiler va linker yaratgan native binary’ni bildiradi. Biroq shell script, Java archive yoki runtime launcher orqali ishlaydigan paket ham bajariladigan dastur vazifasini bajarishi mumkin.
Native executable
Native executable ma’lum protsessor architecture’si uchun machine instructionlarni saqlaydi.
Masalan:
- x86-64;
- ARM64;
- RISC-V;
- Power Architecture.
Bunday fayl boshqa architecture’da emulyator yoki translation qatlami bo‘lmasa ishlamaydi.
Native executable operatsion tizim ABI va file formatiga ham bog‘liq.
File format
Keng tarqalgan executable formatlar:
- ELF — Linux va ko‘p Unix-like tizimlar;
- PE — Windows;
- Mach-O — macOS va boshqa Apple platformalari;
- firmware va embedded tizimlarda maxsus image formatlari.
Format loaderga quyidagilarni ko‘rsatadi:
- entry point;
- code va data segmentlari;
- memory permission;
- dynamic dependency;
- relocation;
- symbol;
- architecture;
- platform metadata.
Loader
Executable ishga tushirilganda operatsion tizim loaderi faylni processga aylantiradi.
Jarayon:
- file header tekshiriladi;
- architecture va format aniqlanadi;
- virtual address space yaratiladi;
- code va data segmentlari map qilinadi;
- dynamic librarylar yuklanadi;
- relocation bajariladi;
- stack, argument va environment tayyorlanadi;
- entry pointga boshqaruv beriladi.
Executable faylning o‘zi process emas. U ishga tushirilgandan keyin process instance paydo bo‘ladi.
Entry point
Entry point bajarilish boshlanadigan manzil.
C dasturida developer main() funksiyasini yozadi, ammo loader ko‘pincha avval runtime startup kodiga o‘tadi.
Startup code:
- argumentlarni tayyorlaydi;
- runtime’ni boshlaydi;
- global constructorlarni chaqiradi;
main()ni ishga tushiradi;- return qiymatini process exit code’ga aylantiradi;
- cleanup bajaradi.
Shu sababli executable entry point har doim source’dagi mainning o‘zi emas.
Segmentlar
Executable memoryga bir nechta segment sifatida yuklanadi.
Text segment
Machine instructionlar. Odatda read va execute huquqiga ega, write huquqi yo‘q.
Read-only data
String literal va o‘zgarmas constantlar.
Data segment
Boshlang‘ich qiymatga ega writable global ma’lumot.
BSS
Boshlang‘ich qiymati nol bo‘lgan global ma’lumot. Faylda to‘liq nol baytlar saqlanmasligi mumkin.
Dynamic segment
Loader va dynamic linker uchun dependency va relocation ma’lumoti.
Dynamic executable
Dynamic executable tashqi shared librarylarga tayanadi.
Afzalliklari:
- executable hajmi kichikroq;
- library code ko‘p process orasida bo‘lishiladi;
- library alohida patch qilinadi.
Kamchiliklari:
Dependencylar ldd, PE import table yoki platformaga mos vosita bilan ko‘riladi.
Static executable
Static linking kerakli library code’ni executable ichiga qo‘shadi.
Afzalliklari:
- deployment soddaroq;
- hostdagi library versiyasiga kam bog‘liq;
- minimal container yoki recovery muhitda qulay.
Kamchiliklari:
- fayl kattaroq;
- library security patchi uchun qayta build;
- ayrim system integratsiyalari baribir dynamic bo‘lishi mumkin;
- license shartlari.
Position-independent executable
ASLR uchun executable turli virtual manzilda yuklana olishi kerak.
PIE code absolut manzilga qattiq bog‘lanmasdan ishlaydi.
Loader har ishga tushishda base address’ni o‘zgartirishi mumkin.
Bu exploitationni qiyinlashtiradi, ammo xotira xatolarini yo‘q qilmaydi.
Executable permission
Unix-like tizimda file mode executable bitga ega bo‘lishi kerak.
-rwxr-xr-x
Biroq permissionning o‘zi fayl formatini bajariladigan qilmaydi.
Noto‘g‘ri format:
Exec format error
xatosini berishi mumkin.
Windows ko‘pincha file extension va PE header orqali formatni aniqlaydi.
Shebang
Scriptning birinchi qatori interpreter yo‘lini ko‘rsatishi mumkin.
#!/usr/bin/env python3
Kernel yoki launcher scriptni shu interpreterga argument sifatida uzatadi.
Shebang:
- fayl boshida bo‘lishi;
- to‘g‘ri newline;
- mavjud interpreter;
- executable permission
talab qiladi.
Argument va environment
Executable processga aylanganda command-line argumentlar va environment variable’lar beriladi.
Native startup ularni argc, argv yoki runtime’ga mos objectlarga aylantiradi.
Argument va environment maxfiy ma’lumot uchun ehtiyotkorlik bilan ishlatiladi, chunki process listing, crash report yoki logda ko‘rinishi mumkin.
Exit code
Executable tugaganda operatsion tizimga exit status qaytaradi.
Umumiy convention:
0— muvaffaqiyat;- boshqa qiymat — xato yoki maxsus natija.
Signal bilan tugash alohida qayd etiladi.
CLI automation exit code orqali qaror qiladi.
Debug symbol
Release executable’dan debug symbol olib tashlanishi mumkin.
Symbol:
beradi.
Alohida symbol artifact aniq build ID bilan saqlanadi.
Code signing
Executable digital signature bilan imzolanishi mumkin.
Platforma:
- publisher;
- certificate;
- file integrity;
- timestamp;
- trust chain
ni tekshiradi.
Signature zararli publisherni “yaxshi” qilmaydi, ammo fayl kim tomonidan chiqarilganini va o‘zgarmaganini tasdiqlaydi.
Architecture mosligi
Executable header target architecture’ni bildiradi.
64-bit OS ayrim 32-bit executable’larni compatibility layer bilan ishlatishi mumkin.
ARM64 tizim x86-64 binary’ni emulyatsiya yoki translation orqali bajarishi mumkin, ammo native librarylar ham mos bo‘lishi kerak.
Diagnostika
Executable ishga tushmasa quyidagilar tekshiriladi:
- file format;
- architecture;
- execute permission;
- shebang;
- dynamic library;
- loader path;
- ABI;
- code signature;
- security policy;
- entry point;
- corrupted file.
“File not found” xatosi executable mavjud bo‘lsa ham uning interpreter yoki dynamic loaderi topilmaganini anglatishi mumkin.
Bog‘liq tushunchalar
Binary, ELF, PE, Mach-O, Loader, Entry point, Dynamic linking, Static linking, Process, Code signing