Stranica za preuzimanje kaže 32-bit, datoteka sleti na Raspberry Pi, a instalater padne s porukom koja ne imenuje nijedan koristan dio problema. Dva potpuno različita izvršna fajla oba se računaju kao 32-bit u smislu ELF-a, a samo jedan od njih može raditi 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 prije nego promijenite biblioteku ili isprobate drugo ogledalo.

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

Linux ELF referenca definiše polje klase i polje mašine u zaglavlju datoteke, a ta dva odgovaraju na različita pitanja. Klasa kaže koristi li datoteka 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 riječi ipak isporučuje kod koji procesor ne može dekodirati. Treća vrijednost koju vrijedi 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 dijeljene objekte koji će učitavaču trebati. Zabilježite klasu, mašinu i interpretator zajedno, jer te tri vrijednosti su cijelo pitanje kompatibilnosti na ovom sloju. Nijedna od tri ne pojavljuje se 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 pokretati 32-bitni korisnički prostor samo kada su taj prostor i njegov učitavač instalirani, pa sposobnosti procesora nisu odlučujući faktor. Jedna kratka provjera imenuje interpretator na jednom redu, i to 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 s arhitekturom paketa

Arhitekture paketa distribucija kodiraju istu razliku svojim rječnikom, a upravo na taj rječnik upućuje izjava dobavljača o podršci. Uporedite vrijednost koju vaš upravitelj paketa prijavi s vrijednošću koju dobavljač dokumentuje, umjesto da uporedite marketinšku oznaku s imenom datoteke. Parovi koji stvaraju probleme su amd64 protiv arm64 i armhf protiv armel, jer svaki par izgleda zamjenjivo na listi za preuzimanje. Ime datoteke koje 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 riječ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 tvrdi zahtjev, a ne kao nagovještaj, jer kernel razrješava tu putanju prije nego se izvrši bilo koji vaš kod. Emulacija je odluka o postavljanju s vlastitim posljedicama po performanse i podršku, i nikada je ne podrazumijeva procesor koji reklamira širu veličinu riječi.

dpkg --print-architecture

ENOEXEC i ENOENT su različiti neuspjesi

Faza pokretanja prijavi jednu od dvije greške, a one upućuju na različite probleme. Čitanje vrijednosti greške klasifikuje neuspjeh prije nego 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šni fajl. 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 smjeru. Navedite vrijednost 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 provjeru zavisnosti nehajno na datoteci kojoj ne vjerujete, jer njeno pokretanje u nekim okolnostima može izvršiti kod iz binarnog fajla. Ne dodajte simboličke veze za učitavač, ne mijenjajte biblioteke hosta i ne preuzimajte stari arhiv s ogledala treće strane da biste zaobišli poruku. Svako od toga širi površinu promjene, a ne dodiruje neusklađenost koju je zaglavlje već imenovalo.

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

Povezani članci