In downloadside seit 32-bit, it bestân lânet op in Raspberry Pi, en de ynstallearder mislearret mei in berjocht dat gjin nuttich part fan it probleem neamt. Twa folslein ferskillende útfierbere bestannen telle beide as 32-bit yn ’e ELF-betsjutting, en mar ien fan harren kin op dat board rinne. It klassefjild is ien feit, it masinefjild is in oar, en in bestânsnamme fertelt jo betrouber gjin fan beide. Lês de kop foardat jo in biblioteek feroarje of in oare spegel probearje.

De klasse seit wurdgrutte, de masine seit ynstruksjeset

De Linux ELF-referinsje definiearret in klassefjild en in masinefjild yn ’e bestânskop, en dy beiden beäntwurdzje ferskillende fragen. De klasse seit oft it bestân de 32-bit- as de 64-bit-foarm brûkt; de masine seit foar hokker ynstruksjeset it boud is. In 32-bit x86-build en in 32-bit ARM-build binne it iens oer it earste en ferskille oer it twadde. Sa leveret in label dat de juste wurdgrutte ûnthjit dochs koade dy’t de prosessor net dekodearje kin. De tredde wearde dy’t it lêzen wurdich is, is de frege ynterpretearder, dy’t de programmakoppen neame as it binêre bestân ien ferklearret.

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

It earste kommando prints de kop, it twadde prints programmakoppen as it bestân dy hat, en it tredde listet de dielde objekten op dy’t de lader nedich hat. Skriuw klasse, masine en ynterpretearder tegearre del, want dy trije wearden binne de hiele kompatibiliteitsfraach op dit nivo. Gjin fan de trije stiet op in downloadknop, dêrom moat it bestân ûndersocht wurde yn stee fan beskrean.

Hokker ynterpretearder it fan de kearn freget

In útfierber bestân dat in ynterpretearder ferklearret, freget de kearn om ien beskaat laderpaad. As dy lader ûntbrekt, mislearret it starten ek al stiet it bestân dat jo neamden krekt dêr. Dat is it punt dêr’t minsken beslute dat de download skansearre is, wylst it echte antwurd in lader is dy’t de distribúsje net leveret.

Meitsje de lader passend by it systeem dat jo echt draaie: de OS-ferzje, de argitektuer fan ’e brûkersromte en it pakket dat de lader leveret. In 64-bit kearn kin in 32-bit brûkersromte allinnich draaie as dy romte en syn lader ynstallearre binne, dus de kapasiteiten fan ’e prosessor binne net de beslissende faktor. Ien koarte kontrôle neamt de ynterpretearder op ien rigel, en it kostet minder tiid as in stipekaart. In shell-skript mislearret wer oars, want syn ynterpretearder wurdt op ’e earste rigel neamd en net yn in ELF-kop, en dy rigel lêze kostet neat.

file --brief ./vendor-vpn

Meitsje de download passend by de pakketargitektuer

De pakketargitektueren fan distribúsjes kodearje itselde ûnderskie yn har eigen wurdskat, en op dy wurdskat doelt de stipeferklearring fan in leveransier. Fergelykje de wearde dy’t jo pakketbehearder rapportearret mei de wearde dy’t de leveransier dokumintearret, yn stee fan in marketinglabel mei in bestânsnamme te fergelykjen. De pearen dy’t problemen jouwe binne amd64 tsjin arm64, en armhf tsjin armel, want elk pear liket útwikselber yn in downloadlist. In bestânsnamme dy’t einiget op x64 of ia32 beskriuwt in builddoel, net de masine dy’t it hâldt.

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

Elke rigel is in gefal dêr’t de wurdgrutte goed liket en de koade him dochs ferkeard hâldt en draacht, of dêr’t it start en dan ien laach leger mislearret. Lês de ynterpretearder-kolom as in hurde eask en net as in oanwizing, want de kearn lost dat paad op foardat ien fan jo koade útfierd wurdt. Emulaasje is in ynsetbeslissing mei eigen gefolgen foar prestaasjes en stipe, en it wurdt nea ymplisearre troch in prosessor dy’t in bredere wurdgrutte advertearret.

dpkg --print-architecture

ENOEXEC en ENOENT binne ferskillende flaters

De startfaze rapportearret ien fan twa flaters, en se wize op ferskillende problemen. It lêzen fan ’e flaterwearde klassifisearret de mislearring foardat jo wat oars draaie.

ENOEXEC betsjut dat it formaat net werkenne is: ferkearde argitektuer, ferkearde klasse, of eat dat hielendal gjin útfierber bestân is. ENOENT op in ELF-bestân betsjut meastentiids dat de ynterpretearder ûntbrekt, ek al bestiet it bestân dat jo fregen. Deselde ENOENT kin ek betsjutte dat de ynterpretearder fan in skript ûntbrekt, dêrom docht de earste rigel fan in skript der ta. Hoe dan ek neamt it berjocht de laach, en elk «net fûn» as in ûntbrekkende konfiguraasje behannelje stjoert it ûndersyk de ferkearde kant op. Sitearje de flaterwearde yn it kaart, want it oerlibbet it neiferhaal better as de sin deromhinne.

Wat net te dwaan as it binêre bestân net start

In ûnferklearre binêr bestân troch in shell-omhulsel triuwe lit it net rinne. Doch gjin ôfhinklikens-kontrôle samar op in bestân dêr’t jo net op fertrouwe, want it draaien dêrfan kin yn guon omstannichheden koade út it binêre bestân útfierer. Foegje gjin lader-symlinken ta, wikselje gjin hostbiblioteken en helje gjin âld argyf fan in tredde-partij-spegel om it berjocht foarby te kommen. Elk dêrfan ferbreedet it feroaringsoerflak sûnder de misferhâlding oan te reitsjen dy’t de kop al neamd hat.

As jo jo ta de leveransier rjochtsje, stjoer dan wearden yn stee fan in ferhaal: de OS-ferzje, de pakketargitektuer, de klasse- en masinestrings, de frege ynterpretearder en de earste flaterrigel. Dy set lost stipefragen flugger op as in skermôfdruk fan in mislearjende ynstallearder. Alde artefakten en ûnthâlden foarumútfier binne gjin aktuele stipematriks, en sadree’t in lânseigen binêr bestân lade is, bliuwe profyl, autentikaasje en routing apart wurk.

Relatearre artikelen