Stránka ke stažení hlásí 32 bitů, soubor přistane na Raspberry Pi a instalátor selže se zprávou, která nepojmenuje žádnou užitečnou část problému. Dva zcela odlišné spustitelné soubory se v pojetí ELF oba počítají jako 32bitové a na této desce může běžet jen jeden z nich. Pole třídy je jeden fakt, pole stroje druhý a název souboru vám spolehlivě neřekne ani jedno. Přečtěte si hlavičku, než změníte knihovnu nebo zkusíte jiné zrcadlo.

Třída říká velikost slova, stroj říká instrukční sadu

Referenční příručka ELF pro Linux definuje v hlavičce souboru pole třídy a pole stroje a tato dvě odpovídají na různé otázky. Třída říká, zda soubor používá 32bitovou, nebo 64bitovou podobu; stroj říká, pro kterou instrukční sadu byl sestaven. 32bitové sestavení x86 a 32bitové sestavení ARM se shodují v prvním a rozcházejí ve druhém. Tak štítek slibující správnou velikost slova přesto dodá kód, který procesor nedokáže dekódovat. Třetí hodnota, kterou stojí za to číst, je požadovaný interpret, který hlavičky programu pojmenují, když jej binárka deklaruje.

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

První příkaz vypíše hlavičku, druhý vypíše hlavičky programu, pokud je soubor má, a třetí vypíše sdílené objekty, které bude zavaděč potřebovat. Zaznamenejte třídu, stroj a interpret společně, protože tyto tři hodnoty jsou celá otázka kompatibility na této vrstvě. Žádná z těch tří se neobjevuje na tlačítku ke stažení, a proto je nutné soubor prozkoumat, ne popsat.

Jaký interpret žádá od jádra

Spustitelný soubor, který deklaruje interpret, žádá jádro o jednu konkrétní cestu zavaděče. Když tento zavaděč chybí, spuštění selže, i když soubor, který jste uvedli, leží přímo tam. To je okamžik, kdy lidé usoudí, že je stažení poškozené, zatímco skutečnou odpovědí je zavaděč, který distribuce nedodává.

Slaďte zavaděč se systémem, který skutečně používáte: vydání OS, architektura uživatelského prostoru a balíček, který zavaděč poskytuje. 64bitové jádro může spustit 32bitový uživatelský prostor jen tehdy, když je tento prostor a jeho zavaděč nainstalován, takže schopnosti procesoru nejsou rozhodujícím faktorem. Jedna krátká kontrola pojmenuje interpret na jediném řádku a zabere méně času než tiket podpory. Shellový skript selhává zase jinak, protože jeho interpret je pojmenován na prvním řádku, ne v hlavičce ELF, a přečíst tento řádek nic nestojí.

file --brief ./vendor-vpn

Slaďte stažení s architekturou balíčku

Architektury balíčků distribucí kódují stejný rozdíl vlastním slovníkem a právě na tento slovník odkazuje prohlášení dodavatele o podpoře. Porovnejte hodnotu, kterou hlásí váš správce balíčků, s hodnotou, kterou dokumentuje dodavatel, místo abyste porovnávali marketingový štítek s názvem souboru. Páry, které působí potíže, jsou amd64 proti arm64 a armhf proti armel, protože každý pár vypadá v seznamu ke stažení zaměnitelně. Název souboru končící na x64 nebo ia32 popisuje cíl sestavení, ne stroj, který jej 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ý řádek je případ, kdy velikost slova vypadá správně a kód se přesto chová špatně, nebo kdy se spustí a pak selže o vrstvu níž. Čtěte sloupec interpretu jako tvrdý požadavek, ne jako nápovědu, protože jádro tuto cestu vyřeší dřív, než se spustí jakýkoli váš kód. Emulace je rozhodnutí o nasazení s vlastními důsledky pro výkon a podporu a procesor, který inzeruje širší velikost slova, ji nikdy neimplikuje.

dpkg --print-architecture

ENOEXEC a ENOENT jsou různé poruchy

Fáze spouštění hlásí jednu ze dvou chyb a ty ukazují na různé problémy. Přečtení hodnoty chyby zařadí poruchu dřív, než spustíte cokoli dalšího.

ENOEXEC znamená, že formát nebyl rozpoznán: špatná architektura, špatná třída nebo něco, co vůbec není spustitelný soubor. ENOENT u souboru ELF obvykle znamená, že chybí interpret, i když soubor, který jste si vyžádali, existuje. Stejný ENOENT může také znamenat, že chybí interpret skriptu, a proto má první řádek skriptu význam. V obou případech zpráva pojmenuje vrstvu a přístup ke každému „nenalezeno“ jako k chybějící konfiguraci posílá vyšetřování špatným směrem. Uveďte hodnotu chyby v tiketu, protože přežije převyprávění lépe než věta kolem ní.

Co nedělat, když se binárka nespustí

Protlačit nevysvětlenou binárku přes shellový obal ji nespustí. Nespouštějte kontrolu závislostí bez rozmyslu na souboru, kterému nedůvěřujete, protože její spuštění může za některých okolností vykonat kód z binárky. Nepřidávejte symbolické odkazy zavaděče, neprohazujte knihovny hostitele a nestahujte starý archiv z cizího zrcadla, abyste zprávu obešli. Každé z toho rozšiřuje plochu změny, aniž by se dotklo nesouladu, který hlavička už pojmenovala.

Když se obracíte na dodavatele, posílejte hodnoty, ne příběh: vydání OS, architekturu balíčku, řetězce třídy a stroje, požadovaný interpret a první řádek chyby. Tato sada řeší otázky podpory rychleji než snímek obrazovky selhávajícího instalátoru. Staré artefakty a zapamatované výstupy z fór nejsou aktuální matice podpory a jakmile se nativní binárka načte, profil, ověřování a směrování zůstávají samostatnou prací.

Související články