Allalaadimisleht ütleb 32-bit, fail maandub Raspberry Pi-le ja paigaldaja nurjub teatega, mis ei nimeta probleemi ühtegi kasulikku osa. Kaks täiesti erinevat käivitatavat faili loetakse ELF-i mõttes mõlemad 32-bitiseks ja ainult üks neist saab sellel plaadil joosta. Klassiväli on üks fakt, masinaväli on teine, ja failinimi ei ütle teile usaldusväärselt kumbagi. Lugege päist enne, kui muudate teeki või proovite teist peeglit.

Klass ütleb sõna suuruse, masin ütleb käsustiku

Linuxi ELF-viide määratleb failipäises klassivälja ja masinavälja ning need kaks vastavad erinevatele küsimustele. Klass ütleb, kas fail kasutab 32-bitist või 64-bitist vormi; masin ütleb, millise käsustiku jaoks see ehitati. 32-bitine x86 build ja 32-bitine ARM build nõustuvad esimeses ja lahknevad teises. Nii tarnib õiget sõna suurust lubav silt siiski koodi, mida protsessor ei suuda dekodeerida. Kolmas lugemist väärt väärtus on nõutav interpretaator, mille programmipäised nimetavad, kui binaarfail selle deklareerib.

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

Esimene käsk trükib päise, teine trükib programmipäised, kui failil neid on, ja kolmas loetleb jagatud objektid, mida laadija vajab. Kirjutage klass, masin ja interpretaator koos üles, sest need kolm väärtust on kogu ühilduvusküsimus sellel kihil. Ükski neist kolmest ei ilmu allalaadimisnupul, seepärast tuleb faili uurida, mitte kirjeldada.

Millist interpretaatorit see tuumalt palub

Käivitatav fail, mis deklareerib interpretaatori, palub tuumalt ühte kindlat laadija teed. Kui see laadija puudub, nurjub käivitamine isegi siis, kui teie nimetatud fail lebab täpselt seal. See on koht, kus inimesed otsustavad, et allalaadimine on rikutud, samal ajal kui tegelik vastus on laadija, mida distributsioon ei tarni.

Sobitage laadija süsteemiga, mida te tegelikult käitate: OS-i väljalase, kasutajaruumi arhitektuur ja pakett, mis laadija pakub. 64-bitine tuum saab 32-bitist kasutajaruumi käitada ainult siis, kui see ruum ja selle laadija on paigaldatud, seega ei ole protsessori võimed otsustav tegur. Üks lühike kontroll nimetab interpretaatori ühel real ja see võtab vähem aega kui tugipilet. Shell-skript nurjub jälle teisiti, sest selle interpretaator on nimetatud esimesel real, mitte ELF-päises, ja selle rea lugemine ei maksa midagi.

file --brief ./vendor-vpn

Sobitage allalaadimine paketi arhitektuuriga

Distributsioonide paketiarhitektuurid kodeerivad sama erinevuse oma sõnavaras ja just sellele sõnavarale viitab tarnija tugiavaldus. Võrrelge väärtust, mille teie paketihaldur teatab, väärtusega, mille tarnija dokumenteerib, selle asemel et võrrelda turunduslikku silti failinimega. Probleeme tekitavad paarid on amd64 versus arm64 ja armhf versus armel, sest iga paar näeb allalaadimisnimekirjas vahetatav välja. Failinimi, mis lõpeb x64 või ia32-ga, kirjeldab buildi sihtmärki, mitte masinat, mis seda hoiab.

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

Iga rida on juhtum, kus sõna suurus näib õige ja kood käitub ikkagi valesti, või kus see käivitub ja nurjub siis ühe kihi võrra allpool. Lugege interpretaatori veergu kõva nõudena, mitte vihjena, sest tuum lahendab selle tee enne, kui ükski teie kood jookseb. Emuleerimine on juurutamisotsus, millel on omad jõudlus- ja toe tagajärjed, ja seda ei vihja kunagi laiemat sõna suurust reklaamiv protsessor.

dpkg --print-architecture

ENOEXEC ja ENOENT on erinevad tõrked

Käivitusetapp teatab ühest kahest veast ja need osutavad erinevatele probleemidele. Vea väärtuse lugemine liigitab tõrke enne, kui te midagi muud käivitate.

ENOEXEC tähendab, et vormingut ei tuvastatud: vale arhitektuur, vale klass või midagi, mis pole üldse käivitatav fail. ENOENT ELF-failil tähendab tavaliselt, et interpretaator puudub, kuigi teie küsitud fail on olemas. Sama ENOENT võib tähendada ka seda, et skripti interpretaator puudub, seepärast on skripti esimene rida oluline. Mõlemal juhul nimetab teade kihi ja iga „ei leitud“ kohtlemine puuduva konfiguratsioonina saadab uurimise valesse suunda. Tsiteerige piletil vea väärtust, sest see talub ümberjutustamist paremini kui seda ümbritsev lause.

Mida mitte teha, kui binaarfail ei käivitu

Selgitamata binaarfaili shell-kesta kaudu läbi surumine ei pane seda jooksma. Ärge käivitage sõltuvuskontrolli hooletult failil, mida te ei usalda, sest selle käivitamine võib teatud asjaoludel käivitada koodi binaarfailist. Ärge lisage laadija sümbollinke, vahetage hosti teeke ega tooge vana arhiivi kolmanda osapoole peeglist, et teatest mööda pääseda. Igaüks neist laiendab muudatuse pinda puutumata lahknevust, mille päis juba nimetas.

Kui pöördute tarnija poole, saatke väärtusi, mitte lugu: OS-i väljalase, paketi arhitektuur, klassi- ja masinastringid, nõutav interpretaator ja esimene vearida. See komplekt lahendab tugiküsimusi kiiremini kui nurjuva paigaldaja ekraanitõmmis. Vanad artefaktid ja meenutatud foorumiväljundid ei ole praegune tugimaatriks ja pärast natiivse binaarfaili laadimist jäävad profiil, autentimine ja marsruutimine eraldi tööks.

Seotud artiklid