Ei nedlastingsside seier 32-bit, fila landar på ein Raspberry Pi, og installatøren feilar med ei melding som ikkje namngjev nokon nyttig del av problemet. To heilt ulike køyrbare filer vert begge talde som 32-bit i ELF-forstand, og berre éi av dei kan køyre på det kortet. Klassefeltet er eitt faktum, maskinfeltet er eit anna, og eit filnamn fortel deg påliteleg ingen av dei. Les headeren før du byter eit bibliotek eller prøver ei anna spegling.

Klassen seier ordstorleik, maskinen seier instruksjonssett

Linux ELF-referansen definerer eit klassefelt og eit maskinfelt i filheaderen, og dei to svarar på ulike spørsmål. Klassen seier om fila brukar 32-bit- eller 64-bit-forma; maskinen seier kva instruksjonssett ho er bygd for. Eit 32-bit x86-bygg og eit 32-bit ARM-bygg er samde om det første og usamde om det andre. Slik leverer ei etikett som lovar rett ordstorleik likevel kode som prosessoren ikkje kan dekode. Den tredje verdien som er verdt å lese, er tolken som vert beden om, og som programheaderane namngjev når den binære fila erklærer ein.

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

Den første kommandoen skriv ut headeren, den andre skriv ut programheaderar når fila har nokon, og den tredje listar opp dei delte objekta som lastaren treng. Noter klasse, maskin og tolk saman, fordi desse tre verdiane er heile kompatibilitetsspørsmålet på dette nivået. Ingen av dei tre står på ein nedlastingsknapp, og difor må fila undersøkjast i staden for å skildrast.

Kva for ein tolk ho ber kjernen om

Ei køyrbar fil som erklærer ein tolk, ber kjernen om éin bestemt lastarsti. Når den lastaren manglar, feilar oppstarten sjølv om fila du namngav ligg rett der. Det er her folk konkluderer med at nedlastinga er øydelagd, medan det faktiske svaret er ein lastar som distribusjonen ikkje leverer.

Tilpass lastaren til systemet du faktisk køyrer: OS-utgåva, arkitekturen i brukarrommet og pakken som leverer lastaren. Ein 64-bits kjerne kan berre køyre eit 32-bits brukarrom når det brukarrommet og lastaren er installerte, så evnene til prosessoren er ikkje den avgjerande faktoren. Éin kort sjekk namngjev tolken på éi linje, og han tek mindre tid enn ein støttebillett. Eit shell-skript feilar på ein annan måte igjen, fordi tolken er namngjeven på første linje og ikkje i ein ELF-header, og å lese den linja kostar ingenting.

file --brief ./vendor-vpn

Tilpass nedlastinga til pakkearkitekturen

Pakkearkitekturane til distribusjonane kodar den same skilnaden i sitt eige vokabular, og det er dette vokabularet ei støttefråsegn frå ein leverandør viser til. Samanlikn verdien pakkebehandsamaren din rapporterer, med verdien leverandøren dokumenterer, i staden for å samanlikne ei marknadsføringsetikett med eit filnamn. Para som skaper trøbbel, er amd64 mot arm64 og armhf mot armel, fordi kvart par ser utbytbart ut i ei nedlastingsliste. Eit filnamn som sluttar på x64 eller ia32 skildrar eit byggemål, ikkje maskinen som held det.

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

Kvar rad er eit tilfelle der ordstorleiken ser riktig ut og koden likevel oppfører seg feil, eller der han startar og deretter feilar eitt lag lenger nede. Les tolkekolonnen som eit hardt krav og ikkje som eit hint, fordi kjernen løyser den stien før noko av koden din køyrer. Emulering er ei utrullingavgjerd med sine eigne konsekvensar for yting og støtte, og ho vert aldri antyda av ein prosessor som reklamerer med ein breiare ordstorleik.

dpkg --print-architecture

ENOEXEC og ENOENT er ulike feil

Oppstartsfasen rapporterer éin av to feil, og dei peikar på ulike problem. Å lese feilverdien klassifiserer feilen før du køyrer noko anna.

ENOEXEC tyder at formatet ikkje vart kjent att: feil arkitektur, feil klasse eller noko som slett ikkje er ei køyrbar fil. ENOENT på ei ELF-fil tyder vanlegvis at tolken manglar, sjølv om fila du bad om, finst. Den same ENOENT kan òg tyde at tolken til eit skript manglar, og difor betyr første linje i eit skript noko. Uansett namngjev meldinga laget, og å handsame kvar «ikkje funnen» som ein manglande konfigurasjon sender undersøkinga i feil retning. Siter feilverdien i billetten, fordi han overlever attforteljing betre enn setninga rundt.

Kva du ikkje bør gjere når den binære fila ikkje startar

Å tvinge ei uforklart binær fil gjennom ei shell-innpakning får ho ikkje til å køyre. Ikkje køyr ein avhengigheitssjekk lettvint på ei fil du ikkje stoler på, fordi køyringa i visse tilfelle kan utføre kode frå den binære fila. Ikkje legg til lastar-symlenker, byt ikkje vertsbibliotek og hent ikkje eit gamalt arkiv frå ei tredjepartsspegling for å kome forbi meldinga. Kvar av desse utvidar endringsflata utan å røre uoverensstemmda som headeren allereie har namngjeve.

Når du vender deg til leverandøren, send verdiar og ikkje ei historie: OS-utgåva, pakkearkitekturen, klasse- og maskinstrengane, tolken som vert beden om, og den første feillinja. Det settet løyser støttespørsmål raskare enn eit skjermbilete av ein installatør som feilar. Gamle artefaktar og hugsa forumutdata er ikkje ei gjeldande støttematrise, og når ei innebygd binærfil er lasta, er profil, autentisering og ruting framleis separat arbeid.

Relaterte artiklar