Stranica za preuzimanje kaže 32-bit, datoteka sleće na Raspberry Pi, a instalater pada s porukom koja ne imenuje nijedan koristan deo problema. Dva sasvim različita izvršna fajla oba se računaju kao 32-bit u smislu ELF-a, a samo jedan od njih može da radi na toj ploči. Polje klase je jedna činjenica, polje mašine je druga, a ime datoteke vam pouzdano ne kaže nijedno. Pročitajte zaglavlje pre nego što promenite biblioteku ili probate drugo ogledalo.

Klasa kaže veličinu reči, mašina kaže skup instrukcija

Linux ELF referenca definiše polje klase i polje mašine u zaglavlju datoteke, a to dvoje odgovara na različita pitanja. Klasa kaže da li datoteka koristi 32-bitni ili 64-bitni oblik; mašina kaže za koji je skup instrukcija napravljena. 32-bitni x86 build i 32-bitni ARM build slažu se u prvom, a razilaze u drugom. Tako oznaka koja obećava ispravnu veličinu reči ipak isporučuje kod koji procesor ne može da dekodira. Treća vrednost koju vredi pročitati je traženi interpretator, koji zaglavlja programa imenuju kada binarni fajl neki navede.

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

Prva komanda ispisuje zaglavlje, druga ispisuje zaglavlja programa kada ih datoteka ima, a treća navodi deljene objekte koji će učitavaču trebati. Zabeležite klasu, mašinu i interpretator zajedno, jer su te tri vrednosti celo pitanje kompatibilnosti na ovom sloju. Nijedna od tri se ne pojavljuje na dugmetu za preuzimanje, zato datoteku treba pregledati, a ne opisivati.

Koji interpretator traži od kernela

Izvršni fajl koji navede interpretator traži od kernela jednu određenu putanju učitavača. Kada tog učitavača nema, pokretanje padne iako datoteka koju ste naveli stoji upravo tu. To je tačka u kojoj ljudi zaključe da je preuzimanje oštećeno, dok je stvarni odgovor učitavač koji distribucija ne isporučuje.

Uskladite učitavač sa sistemom koji zaista pokrećete: izdanjem OS-a, arhitekturom korisničkog prostora i paketom koji pruža učitavač. 64-bitni kernel može da pokreće 32-bitni korisnički prostor samo kada su taj prostor i njegov učitavač instalirani, pa sposobnosti procesora nisu odlučujući činilac. Jedna kratka provera imenuje interpretator u jednom redu, i traje kraće od tiketa za podršku. Shell skripta pada opet drugačije, jer je njen interpretator naveden u prvom redu, a ne u ELF zaglavlju, i čitanje tog reda ništa ne košta.

file --brief ./vendor-vpn

Uskladite preuzimanje sa arhitekturom paketa

Arhitekture paketa distribucija kodiraju istu razliku sopstvenim rečnikom, a upravo na taj rečnik upućuje izjava dobavljača o podršci. Uporedite vrednost koju vaš upravitelj paketa prijavi sa vrednošću koju dobavljač dokumentuje, umesto da uporedite marketinšku oznaku sa imenom datoteke. Parovi koji stvaraju probleme su amd64 protiv arm64 i armhf protiv armel, jer svaki par izgleda zamenjivo na listi za preuzimanje. Ime datoteke koje se završava na x64 ili ia32 opisuje cilj builda, a ne mašinu koja ga drži.

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

Svaki red je slučaj u kojem veličina reči izgleda ispravno a kod se ipak ponaša loše, ili u kojem se pokrene pa padne sloj niže. Čitajte kolonu interpretatora kao tvrd zahtev, a ne kao nagoveštaj, jer kernel razrešava tu putanju pre nego što se izvrši bilo koji vaš kod. Emulacija je odluka o postavljanju sa sopstvenim posledicama po performanse i podršku, i nikada je ne podrazumeva procesor koji reklamira širu veličinu reči.

dpkg --print-architecture

ENOEXEC i ENOENT su različiti neuspesi

Faza pokretanja prijavi jednu od dve greške, a one upućuju na različite probleme. Čitanje vrednosti greške klasifikuje neuspeh pre nego što pokrenete bilo šta drugo.

ENOEXEC znači da format nije prepoznat: pogrešna arhitektura, pogrešna klasa ili nešto što uopšte nije izvršna datoteka. ENOENT na ELF datoteci obično znači da interpretator nedostaje, iako datoteka koju ste tražili postoji. Isti ENOENT može značiti i da nedostaje interpretator skripte, zato je prvi red skripte važan. U svakom slučaju poruka imenuje sloj, a tretiranje svakog „nije pronađeno“ kao konfiguracije koja nedostaje šalje istragu u pogrešnom smeru. Navedite vrednost greške u tiketu, jer ona bolje podnosi prepričavanje od rečenice oko sebe.

Šta ne treba raditi kada se binarni fajl ne pokreće

Proguravanje neobjašnjenog binarnog fajla kroz shell omotač ne čini da se pokrene. Ne pokrećite proveru zavisnosti nehajno na datoteci kojoj ne verujete, jer njeno pokretanje u nekim okolnostima može izvršiti kod iz binarnog fajla. Ne dodajte simboličke veze za učitavač, ne menjajte biblioteke hosta i ne preuzimajte stari arhiv sa ogledala treće strane da biste zaobišli poruku. Svako od toga širi površinu promene, a ne dotiče neusklađenost koju je zaglavlje već imenovalo.

Kada se obraćate dobavljaču, pošaljite vrednosti a ne priču: izdanje OS-a, arhitekturu paketa, stringove klase i mašine, traženi interpretator i prvi red greške. Taj skup rešava pitanja podrške brže od snimka ekrana instalatera koji pada. Stari artefakti i zapamćeni izlazi sa foruma nisu aktuelna matrica podrške, a nakon što se nativni binarni fajl učita, profil, autentifikacija i rutiranje ostaju odvojen rad.

Povezani članci