VPN-asentaja sanoo 32-bit: tarkista sen sijaan ELF-otsake
Sanan koko ei tunnista käskykantaa. Menettely luokan, koneen ja tulkin lukemiseen ja sitten hostiin sopivan koontiversion pyytämiseen.
Lataussivu sanoo 32-bit, tiedosto päätyy Raspberry Pi:lle ja asentaja epäonnistuu viestillä, joka ei nimeä ongelmasta mitään hyödyllistä osaa. Kaksi täysin erilaista suoritettavaa tiedostoa lasketaan ELF-mielessä molemmat 32-bitiksi, ja vain toinen niistä voi toimia kyseisellä kortilla. Luokkakenttä on yksi tosiasia, konekenttä toinen, eikä tiedostonimi kerro kumpaakaan luotettavasti. Lue otsake ennen kuin vaihdat kirjastoa tai kokeilet toista peiliä.
Luokka kertoo sanan koon, kone kertoo käskykannan
Linuxin ELF-viite määrittelee tiedoston otsakkeeseen luokkakentän ja konekentän, ja ne vastaavat eri kysymyksiin. Luokka kertoo, käyttääkö tiedosto 32-bittistä vai 64-bittistä muotoa; kone kertoo, mille käskykannalle se on koottu. 32-bittinen x86-koonnos ja 32-bittinen ARM-koonnos ovat samaa mieltä ensimmäisestä ja eri mieltä toisesta. Näin oikean sanan koon lupaava tarra toimittaa silti koodia, jota suoritin ei pysty purkamaan. Kolmas lukemisen arvoinen arvo on pyydetty tulkki, jonka ohjelmaotsakkeet nimeävät, kun binaari ilmoittaa sellaisen.
readelf -h -- ./vendor-vpn
readelf -l -- ./vendor-vpn
readelf -d -- ./vendor-vpn | grep NEEDED
Ensimmäinen komento tulostaa otsakkeen, toinen tulostaa ohjelmaotsakkeet kun tiedostossa on niitä, ja kolmas luettelee jaetut objektit, jotka lataaja tarvitsee. Kirjaa luokka, kone ja tulkki yhdessä, sillä nämä kolme arvoa ovat koko yhteensopivuuskysymys tällä tasolla. Mikään kolmesta ei näy latauspainikkeessa, siksi tiedosto on tutkittava eikä kuvattava.
Mitä tulkkia se pyytää ytimeltä
Suoritettava tiedosto, joka ilmoittaa tulkin, pyytää ytimeltä yhtä tiettyä lataajan polkua. Kun tämä lataaja puuttuu, käynnistys epäonnistuu, vaikka nimeämäsi tiedosto on juuri siinä. Tässä kohdassa ihmiset päättävät, että lataus on vioittunut, vaikka todellinen vastaus on lataaja, jota jakelu ei toimita.
Sovita lataaja järjestelmään, jota todella ajat: käyttöjärjestelmän julkaisu, käyttäjäavaruuden arkkitehtuuri ja paketti, joka tarjoaa lataajan. 64-bittinen ydin voi ajaa 32-bittistä käyttäjäavaruutta vain, kun se avaruus ja sen lataaja on asennettu, joten suorittimen kyvyt eivät ole ratkaiseva tekijä. Yksi lyhyt tarkistus nimeää tulkin yhdellä rivillä, ja se vie vähemmän aikaa kuin tukipyyntö. Shell-skripti epäonnistuu taas eri tavalla, koska sen tulkki nimetään ensimmäisellä rivillä eikä ELF-otsakkeessa, ja sen rivin lukeminen ei maksa mitään.
file --brief ./vendor-vpn
Sovita lataus paketin arkkitehtuuriin
Jakelujen pakettiarkkitehtuurit koodaavat saman eron omassa sanastossaan, ja juuri tähän sanastoon toimittajan tukilausunto viittaa. Vertaa sitä arvoa, jonka paketinhallintasi raportoi, siihen arvoon, jonka toimittaja dokumentoi, sen sijaan että vertaisit markkinointitarraa tiedostonimeen. Hankaluuksia aiheuttavat parit ovat amd64 vastaan arm64 ja armhf vastaan armel, koska jokainen pari näyttää latausluettelossa vaihdettavalta. Nimeen x64 tai ia32 päättyvä tiedostonimi kuvaa koontikohdetta, ei konetta, joka sitä pitää.
| Label on the download | ELF class | e_machine | Interpreter the kernel wants | How it fails on the wrong host |
|---|---|---|---|---|
| amd64 | ELF64 | x86-64 | /lib64/ld-linux-x86-64.so.2 | Immediate exec failure on an ARM board |
| armhf | ELF32 | ARM | /lib/ld-linux-armhf.so.3 | Loads on a soft-float system, then fails on a float ABI call |
| i386 | ELF32 | Intel 80386 | /lib/ld-linux.so.2 | Exec format error where no 32-bit loader package exists |
Jokainen rivi on tapaus, jossa sanan koko näyttää oikealta ja koodi käyttäytyy silti väärin, tai jossa se käynnistyy ja epäonnistuu sitten yhden kerroksen alempana. Lue tulkkisaraketta kovana vaatimuksena, älä vihjeenä, koska ydin ratkaisee tämän polun ennen kuin mikään koodistasi suoritetaan. Emulointi on käyttöönottopäätös, jolla on omat suorituskyky- ja tukivaikutuksensa, eikä laajempaa sanan kokoa mainostava suoritin koskaan vihjaa siihen.
dpkg --print-architecture
ENOEXEC ja ENOENT ovat eri virheitä
Käynnistysvaihe raportoi toisen kahdesta virheestä, ja ne osoittavat eri ongelmiin. Virhearvon lukeminen luokittelee epäonnistumisen ennen kuin suoritat mitään muuta.
ENOEXEC tarkoittaa, ettei muotoa tunnistettu: väärä arkkitehtuuri, väärä luokka tai jotain, joka ei ole lainkaan suoritettava tiedosto. ENOENT ELF-tiedostossa tarkoittaa yleensä, että tulkki puuttuu, vaikka pyytämäsi tiedosto on olemassa. Sama ENOENT voi tarkoittaa myös, että skriptin tulkki puuttuu, siksi skriptin ensimmäisellä rivillä on merkitystä. Kummassakin tapauksessa viesti nimeää kerroksen, ja jokaisen „ei löytynyt“-tapauksen käsitteleminen puuttuvana konfiguraationa lähettää tutkinnan väärään suuntaan. Mainitse virhearvo tiketissä, koska se kestää uudelleenkerrontaa ympäröivää lausetta paremmin.
Mitä ei pidä tehdä, kun binaari ei käynnisty
Selittämättömän binaarin pakottaminen shell-kääreen läpi ei saa sitä toimimaan. Älä aja riippuvuustarkistinta huolettomasti tiedostolle, johon et luota, koska sen ajaminen voi joissakin olosuhteissa suorittaa koodia binaarista. Älä lisää lataajan symlinkkejä, vaihda isäntäkoneen kirjastoja äläkä hae vanhaa arkistoa kolmannen osapuolen peilistä päästäksesi viestistä ohi. Jokainen näistä laajentaa muutoksen pintaa koskematta ristiriitaan, jonka otsake jo nimesi.
Kun lähestyt toimittajaa, lähetä arvoja äläkä tarinaa: käyttöjärjestelmän julkaisu, paketin arkkitehtuuri, luokka- ja konejonot, pyydetty tulkki ja ensimmäinen virherivi. Tämä joukko ratkaisee tukikysymykset nopeammin kuin kuvakaappaus epäonnistuvasta asentajasta. Vanhat artefaktit ja muistetut foorumitulosteet eivät ole nykyinen tukimatriisi, ja kun natiivi binaari latautuu, profiili, todennus ja reititys jäävät erilliseksi työksi.