Stran za prenos pravi 32-bit, datoteka pristane na Raspberry Pi in namestitveni program odpove s sporočilom, ki ne imenuje nobenega uporabnega dela težave. Dve povsem različni izvršljivi datoteki se v smislu ELF obe štejeta kot 32-bitni in samo ena od njiju lahko teče na tej plošči. Polje razreda je eno dejstvo, polje stroja drugo, ime datoteke pa vam zanesljivo ne pove nobenega od obeh. Preberite glavo, preden zamenjate knjižnico ali poskusite drugo zrcalo.

Razred pove velikost besede, stroj pove nabor ukazov

Referenca ELF za Linux v glavi datoteke določa polje razreda in polje stroja, in ta dva odgovarjata na različni vprašanji. Razred pove, ali datoteka uporablja 32-bitno ali 64-bitno obliko; stroj pove, za kateri nabor ukazov je bila zgrajena. 32-bitna gradnja x86 in 32-bitna gradnja ARM se ujemata v prvem in razhajata v drugem. Tako oznaka, ki obljublja pravo velikost besede, vseeno dostavi kodo, ki je procesor ne more dekodirati. Tretja vrednost, ki se je vredno brati, je zahtevani tolmač, ki ga glave programa poimenujejo, ko binarna datoteka enega navede.

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

Prvi ukaz izpiše glavo, drugi izpiše glave programa, kadar jih datoteka ima, tretji pa našteje deljene objekte, ki jih bo nalagalnik potreboval. Zabeležite razred, stroj in tolmača skupaj, ker so te tri vrednosti vse vprašanje združljivosti na tej ravni. Nobena od treh ni na gumbu za prenos, zato je treba datoteko pregledati, ne opisati.

Kateri tolmač zahteva od jedra

Izvršljiva datoteka, ki navede tolmača, od jedra zahteva eno določeno pot nalagalnika. Ko tega nalagalnika ni, zagon spodleti, čeprav datoteka, ki ste jo navedli, leži prav tam. To je točka, kjer se ljudje odločijo, da je prenos poškodovan, medtem ko je pravi odgovor nalagalnik, ki ga distribucija ne dobavi.

Uskladite nalagalnik s sistemom, ki ga zares poganjate: izdajo OS, arhitekturo uporabniškega prostora in paket, ki zagotavlja nalagalnik. 64-bitno jedro lahko poganja 32-bitni uporabniški prostor le, ko sta ta prostor in njegov nalagalnik nameščena, zato zmožnosti procesorja niso odločilni dejavnik. Ena kratka preveritev poimenuje tolmača v eni vrstici in traja manj časa kot zahtevek za podporo. Shell skript spodleti spet drugače, ker je njegov tolmač naveden v prvi vrstici in ne v glavi ELF, branje te vrstice pa ne stane nič.

file --brief ./vendor-vpn

Uskladite prenos z arhitekturo paketa

Arhitekture paketov distribucij kodirajo isto razliko v svojem besednjaku in prav na ta besednjak se sklicuje izjava dobavitelja o podpori. Primerjajte vrednost, ki jo poroča vaš upravitelj paketov, z vrednostjo, ki jo dokumentira dobavitelj, namesto da bi primerjali marketinško oznako z imenom datoteke. Pari, ki povzročajo težave, so amd64 proti arm64 in armhf proti armel, ker je vsak par na seznamu za prenos videti zamenljiv. Ime datoteke, ki se konča na x64 ali ia32, opisuje cilj gradnje, ne stroja, ki ga hrani.

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

Vsaka vrstica je primer, ko je velikost besede videti prava in se koda vseeno obnaša napačno, ali ko se zažene in nato spodleti eno plast nižje. Stolpec tolmača berite kot trdo zahtevo in ne kot namig, ker jedro to pot razreši, preden se izvede katera koli vaša koda. Emulacija je odločitev o uvajanju z lastnimi posledicami za delovanje in podporo in procesor, ki oglašuje širšo velikost besede, je nikoli ne implicira.

dpkg --print-architecture

ENOEXEC in ENOENT sta različni okvari

Faza zagona poroča eno od dveh napak in ti kažeta na različne težave. Branje vrednosti napake razvrsti okvaro, preden zaženete karkoli drugega.

ENOEXEC pomeni, da oblika ni bila prepoznana: napačna arhitektura, napačen razred ali nekaj, kar sploh ni izvršljiva datoteka. ENOENT pri datoteki ELF običajno pomeni, da tolmač manjka, čeprav zahtevana datoteka obstaja. Isti ENOENT lahko pomeni tudi, da manjka tolmač skripta, zato ima prva vrstica skripta pomen. V vsakem primeru sporočilo poimenuje plast, obravnavanje vsakega »ni najdeno« kot manjkajoče konfiguracije pa pošlje preiskavo v napačno smer. Navedite vrednost napake v zahtevku, ker bolje prenese ponovno pripovedovanje kot stavek okoli nje.

Česa ne storiti, ko se binarna datoteka ne zažene

Riniti nerazloženo binarno datoteko skozi shell ovoj je ne zažene. Preverjevalnika odvisnosti ne poganjajte lahkomiselno na datoteki, ki ji ne zaupate, ker lahko njegov zagon v nekaterih okoliščinah izvede kodo iz binarne datoteke. Ne dodajajte simbolnih povezav nalagalnika, ne zamenjujte knjižnic gostitelja in ne prenašajte starega arhiva z zrcala tretje strani, da bi obšli sporočilo. Vsako od tega širi površino spremembe, ne da bi se dotaknilo neujemanja, ki ga je glava že poimenovala.

Ko se obrnete na dobavitelja, pošljite vrednosti in ne zgodbe: izdajo OS, arhitekturo paketa, nize razreda in stroja, zahtevani tolmač in prvo vrstico napake. Ta nabor reši vprašanja podpore hitreje kot posnetek zaslona nameščalnika, ki spodleti. Stari artefakti in zapomnjeni izpisi s forumov niso aktualna matrika podpore, po nalaganju izvorne binarne datoteke pa profil, preverjanje pristnosti in usmerjanje ostanejo ločeno delo.

Sorodni članki