Një faqe shkarkimi thotë 32-bit, skedari zbret në një Raspberry Pi dhe instaluesi dështon me një mesazh që nuk emërton asnjë pjesë të dobishme të problemit. Dy skedarë ekzekutues krejtësisht të ndryshëm numërohen të dy si 32-bit në kuptimin ELF, dhe vetëm njëri prej tyre mund të ekzekutohet në atë tabelë. Fusha e klasës është një fakt, fusha e makinës është një tjetër, dhe një emër skedari nuk ju thotë me besueshmëri asnjërën. Lexoni kokën përpara se të ndryshoni një bibliotekë ose të provoni një pasqyrë tjetër.

Klasa thotë madhësinë e fjalës, makina thotë grupin e instruksioneve

Referenca ELF e Linux përcakton një fushë klase dhe një fushë makine në kokën e skedarit, dhe të dyja përgjigjen pyetjeve të ndryshme. Klasa thotë nëse skedari përdor formën 32-bit ose atë 64-bit; makina thotë për cilin grup instruksionesh është ndërtuar. Një build x86 32-bit dhe një build ARM 32-bit bien dakord për të parën dhe ndryshojnë për të dytën. Kështu një etiketë që premton madhësinë e duhur të fjalës gjithsesi dorëzon kod që procesori nuk mund ta dekodojë. Vlera e tretë që vlen të lexohet është interpretuesi i kërkuar, të cilin kokët e programit e emërtojnë kur binari deklaron një të tillë.

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

Komanda e parë shtyp kokën, e dyta shtyp kokët e programit kur skedari ka të tilla, dhe e treta liston objektet e përbashkëta që do t'i nevojiten ngarkuesit. Shënoni klasën, makinën dhe interpretuesin së bashku, sepse këto tre vlera janë e gjithë çështja e përputhshmërisë në këtë shtresë. Asnjëra prej të trejave nuk shfaqet në një buton shkarkimi, prandaj skedari duhet inspektuar dhe jo përshkruar.

Cilin interpretues kërkon nga bërthama

Një skedar ekzekutues që deklaron një interpretues kërkon nga bërthama një rrugë të caktuar ngarkuesi. Kur ai ngarkues mungon, nisja dështon edhe pse skedari që përmendët ndodhet pikërisht aty. Ky është pika ku njerëzit vendosin se shkarkimi është i dëmtuar, ndërsa përgjigjja e vërtetë është një ngarkues që shpërndarja nuk e ofron.

Përputhni ngarkuesin me sistemin që ekzekutoni vërtet: versionin e OS, arkitekturën e hapësirës së përdoruesit dhe paketën që ofron ngarkuesin. Një bërthamë 64-bit mund të ekzekutojë një hapësirë përdoruesi 32-bit vetëm kur ajo hapësirë dhe ngarkuesi i saj janë instaluar, prandaj aftësitë e procesorit nuk janë faktori vendimtar. Një kontroll i shkurtër emërton interpretuesin në një rresht të vetëm, dhe zgjat më pak se një biletë mbështetjeje. Një skript shell dështon përsëri ndryshe, sepse interpretuesi i tij emërtohet në rreshtin e parë dhe jo në një kokë ELF, dhe leximi i atij rreshti nuk kushton asgjë.

file --brief ./vendor-vpn

Përputhni shkarkimin me arkitekturën e paketës

Arkitekturat e paketave të shpërndarjeve kodojnë të njëjtin dallim në fjalorin e tyre, dhe pikërisht atij fjalori i referohet deklarata e mbështetjes së një furnizuesi. Krahasoni vlerën që raporton menaxheri i paketave tuaj me vlerën që dokumenton furnizuesi, në vend që të krahasoni një etiketë marketingu me një emër skedari. Çiftet që krijojnë probleme janë amd64 kundrejt arm64, dhe armhf kundrejt armel, sepse çdo çift duket i këmbyeshëm në një listë shkarkimi. Një emër skedari që mbaron me x64 ose ia32 përshkruan një objektiv build, jo makinën që e mban.

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

Çdo rresht është një rast ku madhësia e fjalës duket e saktë dhe kodi sjellët prapë gabimisht, ose ku fillon dhe pastaj dështon një shtresë më poshtë. Lexoni kolonën e interpretuesit si kërkesë e fortë dhe jo si aluzion, sepse bërthama e zgjidh atë rrugë përpara se të ekzekutohet ndonjë pjesë e kodit tuaj. Emulimi është një vendim vendosjeje me pasoja të vetat për performancën dhe mbështetjen, dhe nuk nënkuptohet kurrë nga një procesor që reklamon një madhësi më të gjerë fjalë.

dpkg --print-architecture

ENOEXEC dhe ENOENT janë dështime të ndryshme

Faza e nisjes raporton një nga dy gabime, dhe ato tregojnë probleme të ndryshme. Leximi i vlerës së gabimit e klasifikon dështimin përpara se të ekzekutoni çdo gjë tjetër.

ENOEXEC do të thotë që formati nuk u njoh: arkitekturë e gabuar, klasë e gabuar ose diçka që nuk është fare skedar ekzekutues. ENOENT në një skedar ELF zakonisht do të thotë që interpretuesi mungon, edhe pse skedari që kërkuat ekziston. I njëjti ENOENT mund të thotë gjithashtu se mungon interpretuesi i një skripti, prandaj rreshti i parë i një skripti ka rëndësi. Në çdo rast mesazhi emërton shtresën, dhe trajtimi i çdo «nuk u gjet» si konfigurim që mungon e dërgon hetimin në drejtimin e gabuar. Citoni vlerën e gabimit në biletë, sepse i mbijeton ritregimit më mirë se fjalia përreth.

Çfarë të mos bëni kur binari nuk niset

Detyrimi i një binari të pashpjeguar përmes një mbështjellësi shell nuk e bën atë të ekzekutohet. Mos e ekzekutoni një kontrollues varësish me lehtësi në një skedar të cilin nuk e besoni, sepse ekzekutimi i tij në disa rrethana mund të ekzekutojë kod nga binari. Mos shtoni lidhje simbolike ngarkuesi, mos ndërroni biblioteka të hostit dhe mos shkarkoni një arkiv të vjetër nga një pasqyrë e palës së tretë për të anashkaluar mesazhin. Secili prej këtyre zgjeron sipërfaqen e ndryshimit pa prekur mospërputhjen që koka tashmë e ka emërtuar.

Kur i drejtoheni furnizuesit, dërgoni vlera dhe jo një histori: versionin e OS, arkitekturën e paketës, vargjet e klasës dhe makinës, interpretuesin e kërkuar dhe rreshtin e parë të gabimit. Ai grup i zgjidh pyetjet e mbështetjes më shpejt se një pamje ekrani e një instaluesi që dështon. Artefaktet e vjetra dhe daljet e forumit të mbajtura mend nuk janë një matricë aktuale mbështetjeje, dhe pasi ngarkohet një binar vendas, profili, vërtetimi dhe drejtimi mbeten punë e veçantë.

Artikuj të ngjashëm