Stranica za preuzimanje kaže 32-bit, datoteka sleti na Raspberry Pi, a instalater padne s porukom koja ne imenuje nijedan koristan dio problema. Dvije posve različite izvršne datoteke obje se računaju kao 32-bit u smislu ELF-a, a samo jedna od njih može raditi na toj ploči. Polje klase je jedna činjenica, polje stroja druga, a ime datoteke vam pouzdano ne kaže nijedno. Pročitajte zaglavlje prije nego promijenite biblioteku ili isprobate drugo zrcalo.

Klasa kaže veličinu riječi, stroj kaže skup instrukcija

Linux ELF referenca definira polje klase i polje stroja u zaglavlju datoteke, a to dvoje odgovara na različita pitanja. Klasa kaže koristi li datoteka 32-bitni ili 64-bitni oblik; stroj kaže za koji je skup instrukcija izgrađena. 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 binarna datoteka neki navede.

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

Prva naredba 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, stroj i interpretator zajedno, jer su te tri vrijednosti cijelo pitanje kompatibilnosti na ovom sloju. Nijedna od tri ne pojavljuje se na gumbu za preuzimanje, zato datoteku treba pregledati, a ne opisivati.

Koji interpretator traži od kernela

Izvršna datoteka koja 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 toč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 sustavom 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 čimbenik. Jedna kratka provjera imenuje interpretator u jednom retku, i traje kraće od tiketa za podršku. Shell skripta pada opet drugačije, jer je njezin interpretator naveden u prvom retku, a ne u ELF zaglavlju, i čitanje tog retka ništa ne košta.

file --brief ./vendor-vpn

Uskladite preuzimanje s arhitekturom paketa

Arhitekture paketa distribucija kodiraju istu razliku vlastitim rječnikom, a upravo na taj rječnik upućuje izjava dobavljača o podršci. Usporedite vrijednost koju vaš upravitelj paketa prijavi s vrijednošću koju dobavljač dokumentira, umjesto da usporedite marketinšku oznaku s imenom datoteke. Parovi koji stvaraju probleme su amd64 protiv arm64 i armhf protiv armel, jer svaki par izgleda zamjenjivo na popisu za preuzimanje. Ime datoteke koje završava na x64 ili ia32 opisuje cilj builda, a ne stroj koji 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 redak 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 stupac 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 klasificira neuspjeh prije nego pokrenete bilo što drugo.

ENOEXEC znači da format nije prepoznat: pogrešna arhitektura, pogrešna klasa ili nešto što uopće 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 redak 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.

Što ne treba raditi kada se binarna datoteka ne pokreće

Proguravanje neobjašnjene binarne datoteke kroz shell omotač ne čini da se pokrene. Ne pokrećite provjeru ovisnosti nehajno na datoteci kojoj ne vjerujete, jer njezino pokretanje u nekim okolnostima može izvršiti kod iz binarne datoteke. Ne dodajte simboličke veze za učitavač, ne mijenjajte biblioteke hosta i ne preuzimajte stari arhiv sa zrcala treće strane da biste zaobišli poruku. Svako od toga širi površinu promjene, a ne dotiče 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 stroja, traženi interpretator i prvi redak greške. Taj skup rješava pitanja podrške brže od snimke zaslona instalatera koji pada. Stari artefakti i zapamćeni izlazi s foruma nisu aktualna matrica podrške, a nakon što se nativna binarna datoteka učita, profil, autentifikacija i usmjeravanje ostaju odvojen rad.

Povezani članci