Atsisiuntimo puslapyje rašoma 32 bit, failas nusileidžia į Raspberry Pi, o diegėjas nepavyksta su pranešimu, kuris neįvardija nė vienos naudingos problemos dalies. Du visiškai skirtingi vykdomieji failai abu laikomi 32 bit ELF prasme, ir tik vienas iš jų gali veikti toje plokštėje. Klasės laukas yra vienas faktas, mašinos laukas – kitas, o failo vardas patikimai nesako nė vieno. Perskaitykite antraštę prieš keisdami biblioteką ar bandydami kitą veidrodį.

Klasė sako žodžio dydį, mašina – instrukcijų rinkinį

Linux ELF žinynas failo antraštėje apibrėžia klasės lauką ir mašinos lauką, ir abu atsako į skirtingus klausimus. Klasė sako, ar failas naudoja 32 bit ar 64 bit formą; mašina sako, kuriam instrukcijų rinkiniui jis sukurtas. 32 bit x86 build ir 32 bit ARM build sutaria dėl pirmojo ir nesutaria dėl antrojo. Taip etiketė, žadanti tinkamą žodžio dydį, vis tiek pateikia kodą, kurio procesorius negali iššifruoti. Trečioji vertė, kurią verta perskaityti, yra prašomas interpretatorius, kurį programos antraštės įvardija, kai binarinis failas vieną deklaruoja.

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

Pirmoji komanda išspausdina antraštę, antroji – programos antraštes, jei failas jų turi, o trečioji išvardija bendrus objektus, kurių reikės įkėlėjui. Užsirašykite klasę, mašiną ir interpretatorių kartu, nes šios trys vertės yra visas suderinamumo klausimas šiame sluoksnyje. Nė viena iš trijų nerodoma atsisiuntimo mygtuke, todėl failą reikia ištirti, o ne aprašyti.

Kokio interpretatoriaus jis prašo branduolio

Vykdomasis failas, deklaruojantis interpretatorių, prašo branduolio vieno konkretaus įkėlėjo kelio. Kai to įkėlėjo nėra, paleidimas nepavyksta, nors jūsų įvardytas failas guli būtent ten. Tai vieta, kur žmonės nusprendžia, kad atsisiuntimas sugadintas, nors tikrasis atsakymas yra įkėlėjas, kurio distribucija netiekia.

Suderinkite įkėlėją su sistema, kurią iš tikrųjų naudojate: OS leidiniu, naudotojo erdvės architektūra ir paketu, kuris teikia įkėlėją. 64 bit branduolys gali paleisti 32 bit naudotojo erdvę tik kai ta erdvė ir jos įkėlėjas įdiegti, todėl procesoriaus galimybės nėra lemiamas veiksnys. Viena trumpa patikra įvardija interpretatorių vienoje eilutėje, ir tai užima mažiau laiko nei pagalbos bilietas. Shell scenarijus nepavyksta dar kitaip, nes jo interpretatorius įvardytas pirmoje eilutėje, o ne ELF antraštėje, ir tos eilutės perskaitymas nieko nekainuoja.

file --brief ./vendor-vpn

Suderinkite atsisiuntimą su paketo architektūra

Distribucijų paketų architektūros koduoja tą patį skirtumą savo žodyne, ir būtent į tą žodyną nurodo tiekėjo pagalbos pareiškimas. Palyginkite vertę, kurią praneša jūsų paketų tvarkyklė, su verte, kurią dokumentuoja tiekėjas, o ne lyginkite rinkodaros etiketę su failo vardu. Poros, kurios kelia problemų, yra amd64 prieš arm64 ir armhf prieš armel, nes kiekviena pora atsisiuntimo sąraše atrodo pakeičiama. Failo vardas, besibaigiantis x64 arba ia32, apibūdina build tikslą, o ne mašiną, kuri jį laiko.

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

Kiekviena eilutė yra atvejis, kai žodžio dydis atrodo teisingas, o kodas vis tiek elgiasi neteisingai, arba kai jis paleidžiamas ir paskui nepavyksta vienu sluoksniu žemiau. Skaitykite interpretatoriaus stulpelį kaip griežtą reikalavimą, o ne užuominą, nes branduolys išsprendžia tą kelią prieš vykdant bet kurią jūsų kodo dalį. Emuliacija yra diegimo sprendimas su savo našumo ir palaikymo pasekmėmis, ir jos niekada neimplikuoja platesnį žodžio dydį reklamuojantis procesorius.

dpkg --print-architecture

ENOEXEC ir ENOENT yra skirtingos klaidos

Paleidimo etapas praneša apie vieną iš dviejų klaidų, ir jos nurodo skirtingas problemas. Klaidos vertės perskaitymas klasifikuoja nepavykimą prieš paleidžiant ką nors kita.

ENOEXEC reiškia, kad formatas nebuvo atpažintas: neteisinga architektūra, neteisinga klasė arba kažkas, kas visai nėra vykdomasis failas. ENOENT ELF faile paprastai reiškia, kad trūksta interpretatoriaus, nors prašytas failas egzistuoja. Tas pats ENOENT gali reikšti ir tai, kad trūksta scenarijaus interpretatoriaus, todėl scenarijaus pirmoji eilutė yra svarbi. Bet kuriuo atveju pranešimas įvardija sluoksnį, o kiekvieno „nerasta“ traktavimas kaip trūkstamos konfigūracijos nukreipia tyrimą netinkama linkme. Cituokite klaidos vertę biliete, nes ji geriau išlaiko perpasakojimą nei ją supantis sakinys.

Ko nedaryti, kai binarinis failas nepaleidžiamas

Neišaiškinto binary failo stūmimas per shell apvalkalą nepriverčia jo veikti. Nevykdykite priklausomybių tikrintuvo lengvabūdiškai faile, kuriuo nepasitikite, nes jo vykdymas tam tikromis aplinkybėmis gali įvykdyti kodą iš binary failo. Nepridėkite įkėlėjo simbolinių nuorodų, nekeiskite host bibliotekų ir nesiimkite seno archyvo iš trečiosios šalies veidrodžio, kad apeitumėte pranešimą. Kiekvienas iš šių dalykų išplečia pakeitimo plotą, neliesdamas neatitikimo, kurį antraštė jau įvardijo.

Kreipdamiesi į tiekėją, siųskite vertes, o ne istoriją: OS leidinį, paketo architektūrą, klasės ir mašinos eilutes, prašomą interpretatorių ir pirmąją klaidos eilutę. Šis rinkinys pagalbos klausimus išsprendžia greičiau nei nepavykusio diegėjo ekrano kopija. Seni artefaktai ir prisiminti forumo išvedimai nėra dabartinė palaikymo matrica, o įkėlus natvųjį binarinį failą profilis, autentifikavimas ir maršrutizavimas lieka atskiras darbas.

Susiję straipsniai