Yuklab olish sahifasi 32-bit deydi, fayl Raspberry Pi’ga tushadi va o‘rnatuvchi muammoning foydali qismini nomlamaydigan xabar bilan muvaffaqiyatsiz tugaydi. Ikki butunlay boshqa bajariladigan fayl ELF ma’nosida ikkalasi ham 32-bit sanaladi va ulardan faqat bittasi o‘sha platada ishlay oladi. Klass maydoni — bir fakt, mashina maydoni — boshqasi, fayl nomi esa sizga ikkalasini ham ishonchli aytmaydi. Kutubxonani almashtirish yoki boshqa oynani sinashdan oldin sarlavhani o‘qing.

Klass so‘z o‘lchamini aytadi, mashina buyruqlar to‘plamini aytadi

Linux ELF ma’lumotnomasi fayl sarlavhasida klass maydoni va mashina maydonini belgilaydi, ikkalasi turli savollarga javob beradi. Klass fayl 32-bit yoki 64-bit shakldan foydalanishini aytadi; mashina esa qaysi buyruqlar to‘plami uchun qurilganini aytadi. 32-bit x86 build va 32-bit ARM build birinchisida kelishadi, ikkinchisida farqlanadi. Shu tarzda to‘g‘ri so‘z o‘lchamini va’da qilgan yorliq ham protsessor hal qila olmaydigan kodni yetkazadi. O‘qishga arziydigan uchinchi qiymat — so‘ralgan interpretator, binar bittasini e’lon qilganda dastur sarlavhalari uni nomlaydi.

readelf -h -- ./vendor-vpn
readelf -l -- ./vendor-vpn
readelf -d -- ./vendor-vpn | grep NEEDED

Birinchi buyruq sarlavhani chop etadi, ikkinchisi faylda bo‘lsa dastur sarlavhalarini chop etadi, uchinchisi yuklovchiga kerak bo‘ladigan umumiy obyektlarni sanaydi. Klass, mashina va interpretatorni birga yozib qo‘ying, chunki bu uch qiymat bu qatlamdagi butun moslik savolidir. Uchtasining hech biri yuklab olish tugmasida ko‘rinmaydi, shuning uchun faylni tavsiflash emas, tekshirish kerak.

U yadrodan qaysi interpretatorni so‘raydi

Interpretatorni e’lon qilgan bajariladigan fayl yadrodan bitta aniq yuklovchi yo‘lini so‘raydi. O‘sha yuklovchi bo‘lmasa, siz nomlagan fayl aynan o‘sha joyda turgan bo‘lsa ham ishga tushish muvaffaqiyatsiz bo‘ladi. Odamlar yuklab olish buzilgan deb qaror qiladigan nuqta shu, haqiqiy javob esa tarqatma taqdim etmaydigan yuklovchi.

Yuklovchini siz haqiqatda ishlatadigan tizimga moslang: OS versiyasi, foydalanuvchi maydoni arxitekturasi va yuklovchini taqdim etuvchi paket. 64-bit yadro 32-bit foydalanuvchi maydonini faqat shu maydon va uning yuklovchisi o‘rnatilgan bo‘lsa ishga tushira oladi, shuning uchun protsessor imkoniyatlari hal qiluvchi omil emas. Bitta qisqa tekshiruv interpretatorni bir satrda nomlaydi va qo‘llab-quvvatlash chiptasidan kam vaqt oladi. Shell skripti yana boshqacha muvaffaqiyatsiz bo‘ladi, chunki uning interpretatori ELF sarlavhasida emas, birinchi satrda nomlangan va o‘sha satrni o‘qish hech narsaga turmaydi.

file --brief ./vendor-vpn

Yuklab olishni paket arxitekturasiga moslang

Tarqatmalarning paket arxitekturalari o‘sha farqni o‘z lug‘atida kodlaydi va sotuvchining qo‘llab-quvvatlash bayonoti aynan shu lug‘atga ishora qiladi. Paket menejeringiz xabar qilgan qiymatni sotuvchi hujjatlashtirgan qiymat bilan solishtiring, marketing yorlig‘ini fayl nomi bilan solishtirish o‘rniga. Muammo keltiradigan juftlar amd64 va arm64, hamda armhf va armel, chunki har bir juft yuklab olish ro‘yxatida almashtiriladigan ko‘rinadi. x64 yoki ia32 bilan tugaydigan fayl nomi build maqsadini tavsiflaydi, uni saqlaydigan mashinani emas.

Label on the downloadELF classe_machineInterpreter the kernel wantsHow it fails on the wrong host
amd64ELF64x86-64/lib64/ld-linux-x86-64.so.2Immediate exec failure on an ARM board
armhfELF32ARM/lib/ld-linux-armhf.so.3Loads on a soft-float system, then fails on a float ABI call
i386ELF32Intel 80386/lib/ld-linux.so.2Exec format error where no 32-bit loader package exists

Har bir satr — so‘z o‘lchami to‘g‘ri ko‘ringan holda kod baribir noto‘g‘ri ishlaydigan holat yoki u boshlanib, keyin bir qatlam pastda muvaffaqiyatsiz bo‘ladigan holat. Interpretator ustunini ishora emas, qat’iy talab sifatida o‘qing, chunki yadro bu yo‘lni sizning kodingizning biron qismi ishga tushishidan oldin hal qiladi. Emulyatsiya — o‘z unumdorlik va qo‘llab-quvvatlash oqibatlariga ega joylashtirish qarori va uni kengroq so‘z o‘lchamini reklama qiluvchi protsessor hech qachon ko‘zda tutmaydi.

dpkg --print-architecture

ENOEXEC va ENOENT — turli muvaffaqiyatsizliklar

Ishga tushirish bosqichi ikkita xatodan biri haqida xabar beradi va ular turli muammolarga ishora qiladi. Xato qiymatini o‘qish boshqa narsani ishga tushirishdan oldin muvaffaqiyatsizlikni tasniflaydi.

ENOEXEC format tanilmaganini bildiradi: noto‘g‘ri arxitektura, noto‘g‘ri klass yoki umuman bajariladigan fayl bo‘lmagan narsa. ELF faylida ENOENT odatda interpretator yo‘qligini bildiradi, siz so‘ragan fayl mavjud bo‘lsa ham. Xuddi shu ENOENT skript interpretatorining yo‘qligini ham bildirishi mumkin, shuning uchun skriptning birinchi satri muhim. Nima bo‘lsa ham xabar qatlamni nomlaydi va har bir «topilmadi»ni yo‘q konfiguratsiya deb qabul qilish tekshiruvni noto‘g‘ri tomonga yuboradi. Chiptada xato qiymatini keltiring, chunki u atrofdagi gapdan ko‘ra qayta hikoyalashga yaxshiroq chidaydi.

Binar ishga tushmasa nima qilmaslik kerak

Tushuntirilmagan binarni shell o‘ramidan zo‘rlab o‘tkazish uni ishga tushirmaydi. Ishonmaydigan faylda bog‘liqlik tekshiruvchisini beparvolik bilan ishga tushirmang, chunki uni ishga tushirish ba’zi sharoitlarda binardan kod bajarishi mumkin. Yuklovchining simvolik havolalarini qo‘shmang, xost kutubxonalarini almashtirmang va xabardan o‘tish uchun uchinchi tomon oynasidan eski arxiv olmang. Bulardan har biri o‘zgarish yuzasini kengaytiradi, lekin sarlavha allaqachon nomlagan nomuvofiqlikka tegmaydi.

Sotuvchiga murojaat qilganda hikoya emas, qiymatlar yuboring: OS versiyasi, paket arxitekturasi, klass va mashina satrlari, so‘ralgan interpretator va birinchi xato satri. Bu to‘plam qo‘llab-quvvatlash savollarini muvaffaqiyatsiz o‘rnatuvchining ekran suratidan tezroq hal qiladi. Eski artefaktlar va eslab qolingan forum chiqishlari joriy qo‘llab-quvvatlash matritsasi emas va mahalliy binar yuklangandan keyin profil, autentifikatsiya va marshrutlash alohida ish bo‘lib qoladi.

O'xshash maqolalar