Stránka na stiahnutie hlási 32 bitov, súbor pristane na Raspberry Pi a inštalátor zlyhá so správou, ktorá nepomenuje žiadnu užitočnú časť problému. Dva úplne odlišné spustiteľné súbory sa v zmysle ELF počítajú oba ako 32-bitové a na tejto doske môže bežať len jeden z nich. Pole triedy je jeden fakt, pole stroja druhý a názov súboru vám spoľahlivo nepovie ani jedno. Prečítajte si hlavičku, skôr než zmeníte knižnicu alebo vyskúšate iné zrkadlo.

Trieda hovorí veľkosť slova, stroj hovorí inštrukčnú sadu

Referenčná príručka ELF pre Linux definuje v hlavičke súboru pole triedy a pole stroja a tieto dve odpovedajú na rôzne otázky. Trieda hovorí, či súbor používa 32-bitovú alebo 64-bitovú formu; stroj hovorí, pre ktorú inštrukčnú sadu bol zostavený. 32-bitové zostavenie x86 a 32-bitové zostavenie ARM sa zhodujú v prvom a rozchádzajú v druhom. Tak štítok sľubujúci správnu veľkosť slova predsa dodá kód, ktorý procesor nedokáže dekódovať. Treťou hodnotou, ktorú sa oplatí čítať, je požadovaný interpret, ktorý hlavičky programu pomenujú, keď ho binárka deklaruje.

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

Prvý príkaz vypíše hlavičku, druhý vypíše hlavičky programu, ak ich súbor má, a tretí vypíše zdieľané objekty, ktoré bude zavádzač potrebovať. Zaznamenajte triedu, stroj a interpret spolu, pretože tieto tri hodnoty sú celá otázka kompatibility na tejto vrstve. Žiadna z nich sa neobjavuje na tlačidle na stiahnutie, preto treba súbor preskúmať, nie opísať.

Aký interpret žiada od jadra

Spustiteľný súbor, ktorý deklaruje interpret, žiada od jadra jednu konkrétnu cestu zavádzača. Keď tento zavádzač chýba, spustenie zlyhá, aj keď súbor, ktorý ste uviedli, leží presne tam. To je okamih, keď ľudia usúdia, že stiahnutie je poškodené, kým skutočnou odpoveďou je zavádzač, ktorý distribúcia nedodáva.

Zlaďte zavádzač so systémom, ktorý skutočne používate: vydanie OS, architektúra používateľského priestoru a balík, ktorý zavádzač poskytuje. 64-bitové jadro môže spustiť 32-bitový používateľský priestor len vtedy, keď je tento priestor a jeho zavádzač nainštalovaný, takže schopnosti procesora nie sú rozhodujúcim faktorom. Jedna krátka kontrola pomenuje interpret na jedinom riadku a zaberie menej času než tiket podpory. Shellový skript zlyháva zase inak, pretože jeho interpret je pomenovaný na prvom riadku, nie v hlavičke ELF, a prečítať ten riadok nič nestojí.

file --brief ./vendor-vpn

Zlaďte stiahnutie s architektúrou balíka

Architektúry balíkov distribúcií kódujú rovnaký rozdiel vlastným slovníkom a práve na tento slovník odkazuje vyhlásenie dodávateľa o podpore. Porovnajte hodnotu, ktorú hlási váš správca balíkov, s hodnotou, ktorú dokumentuje dodávateľ, namiesto porovnávania marketingového štítku s názvom súboru. Páry, ktoré spôsobujú problémy, sú amd64 proti arm64 a armhf proti armel, pretože každý pár vyzerá v zozname na stiahnutie zameniteľne. Názov súboru končiaci na x64 alebo ia32 opisuje cieľ zostavenia, nie stroj, ktorý ho obsahuje.

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

Každý riadok je prípad, keď veľkosť slova vyzerá správne a kód sa napriek tomu správa zle, alebo keď sa spustí a potom zlyhá o vrstvu nižšie. Stĺpec interpreta čítajte ako tvrdú požiadavku, nie ako náznak, pretože jadro túto cestu vyrieši skôr, než sa spustí akýkoľvek váš kód. Emulácia je rozhodnutie o nasadení s vlastnými dôsledkami na výkon a podporu a procesor, ktorý inzeruje širšiu veľkosť slova, ju nikdy neimplikuje.

dpkg --print-architecture

ENOEXEC a ENOENT sú rôzne poruchy

Fáza spustenia hlási jednu z dvoch chýb a tie ukazujú na rôzne problémy. Prečítanie hodnoty chyby zatriedi poruchu skôr, než spustíte čokoľvek ďalšie.

ENOEXEC znamená, že formát nebol rozpoznaný: nesprávna architektúra, nesprávna trieda alebo niečo, čo vôbec nie je spustiteľný súbor. ENOENT pri súbore ELF zvyčajne znamená, že chýba interpret, aj keď požadovaný súbor existuje. Ten istý ENOENT môže znamenať aj chýbajúci interpret skriptu, preto má prvý riadok skriptu význam. V každom prípade správa pomenuje vrstvu a prístup ku každému „nenájdené“ ako k chýbajúcej konfigurácii posiela vyšetrovanie nesprávnym smerom. Uveďte hodnotu chyby v tikete, pretože prežije preprávanie lepšie než veta okolo nej.

Čo nerobiť, keď sa binárka nespustí

Pretlačiť nevysvetlenú binárku cez shellový obal ju nespustí. Nespúšťajte kontrolu závislostí bez rozmyslu na súbore, ktorému nedôverujete, pretože jej spustenie môže za určitých okolností vykonať kód z binárky. Nepridávajte symbolické odkazy zavádzača, nezamieňajte knižnice hostiteľa a nesťahujte starý archív z cudzieho zrkadla, aby ste obišli správu. Každé z toho rozširuje plochu zmeny bez toho, aby sa dotklo nezrovnalosti, ktorú hlavička už pomenovala.

Keď sa obraciate na dodávateľa, posielajte hodnoty, nie príbeh: vydanie OS, architektúru balíka, reťazce triedy a stroja, požadovaný interpret a prvý riadok chyby. Táto sada rieši otázky podpory rýchlejšie než snímka obrazovky zlyhávajúceho inštalátora. Staré artefakty a zapamätané výstupy z fór nie sú aktuálna matica podpory a po načítaní natívnej binárky zostávajú profil, overovanie a smerovanie samostatnou prácou.

Súvisiace články