VPN instalater kaže 32-bit: provjerite ELF zaglavlje
Veličina riječi ne identificira skup instrukcija. Postupak za čitanje klase, stroja i interpretatora, pa zatim za traženje builda koji odgovara hostu.
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 download | ELF class | e_machine | Interpreter the kernel wants | How it fails on the wrong host |
|---|---|---|---|---|
| amd64 | ELF64 | x86-64 | /lib64/ld-linux-x86-64.so.2 | Immediate exec failure on an ARM board |
| armhf | ELF32 | ARM | /lib/ld-linux-armhf.so.3 | Loads on a soft-float system, then fails on a float ABI call |
| i386 | ELF32 | Intel 80386 | /lib/ld-linux.so.2 | Exec 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.