Инсталатер VPN-а каже 32-bit: проверите ELF заглавље
Величина речи не идентификује скуп инструкција. Поступак за читање класе, машине и интерпретатора, затим за тражење build-а који одговара хосту.
Страница за преузимање каже 32-bit, датотека слеће на Raspberry Pi, а инсталатер пада са поруком која не именује ниједан користан део проблема. Два потпуно различита извршна фајла оба се рачунају као 32-bit у смислу ELF-а, а само један од њих може да ради на тој плочи. Поље класе је једна чињеница, поље машине је друга, а име датотеке вам поуздано не каже ниједно. Прочитајте заглавље пре него што промените библиотеку или пробате друго огледало.
Класа каже величину речи, машина каже скуп инструкција
Linux ELF референца дефинише поље класе и поље машине у заглављу датотеке, а то двоје одговара на различита питања. Класа каже да ли датотека користи 32-bitни или 64-bitни облик; машина каже за који је скуп инструкција направљена. 32-bitни x86 build и 32-bitни ARM build слажу се у првом, а разилазе у другом. Тако ознака која обећава исправну величину речи ипак испоручује код који процесор не може да декодира. Трећа вредност коју вреди прочитати је тражени интерпретатор, који заглавља програма именују када бинарни фајл неки наведе.
readelf -h -- ./vendor-vpn
readelf -l -- ./vendor-vpn
readelf -d -- ./vendor-vpn | grep NEEDED
Прва команда исписује заглавље, друга исписује заглавља програма када их датотека има, а трећа наводи дељене објекте који ће учитавачу требати. Забележите класу, машину и интерпретатор заједно, јер су те три вредности цело питање компатибилности на овом слоју. Ниједна од три се не појављује на дугмету за преузимање, зато датотеку треба прегледати, а не описивати.
Који интерпретатор тражи од кернела
Извршни фајл који наведе интерпретатор тражи од кернела једну одређену путању учитавача. Када тог учитавача нема, покретање падне иако датотека коју сте навели стоји управо ту. То је тачка у којој људи закључе да је преузимање оштећено, док је стварни одговор учитавач који дистрибуција не испоручује.
Ускладите учитавач са системом који заиста покрећете: издањем OS-а, архитектуром корисничког простора и пакетом који пружа учитавач. 64-bitни кернел може да покреће 32-bitни кориснички простор само када су тај простор и његов учитавач инсталирани, па способности процесора нису одлучујући чинилац. Једна кратка провера именује интерпретатор у једном реду, и траје краће од тикета за подршку. Shell скрипта пада опет другачије, јер је њен интерпретатор наведен у првом реду, а не у ELF заглављу, и читање тог реда ништа не кошта.
file --brief ./vendor-vpn
Ускладите преузимање са архитектуром пакета
Архитектуре пакета дистрибуција кодирају исту разлику сопственим речником, а управо на тај речник упућује изјава добављача о подршци. Упоредите вредност коју ваш управник пакета пријави са вредношћу коју добављач документује, уместо да упоредите маркетиншку ознаку са именом датотеке. Парови који стварају проблеме су amd64 против arm64 и armhf против armel, јер сваки пар изгледа заменљиво на листи за преузимање. Име датотеке које се завршава на x64 или ia32 описује циљ build-а, а не машину која га држи.
| 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 |
Сваки ред је случај у којем величина речи изгледа исправно а код се ипак понаша лоше, или у којем се покрене па падне слој ниже. Читајте колону интерпретатора као тврд захтев, а не као наговештај, јер кернел разрешава ту путању пре него што се изврши било који ваш код. Емулација је одлука о постављању са сопственим последицама по перформансе и подршку, и никада је не подразумева процесор који рекламира шири величину речи.
dpkg --print-architecture
ENOEXEC и ENOENT су различити неуспеси
Фаза покретања пријави једну од две грешке, а оне упућују на различите проблеме. Читање вредности грешке класификује неуспех пре него што покренете било шта друго.
ENOEXEC значи да формат није препознат: погрешна архитектура, погрешна класа или нешто што уопште није извршна датотека. ENOENT на ELF датотеци обично значи да интерпретатор недостаје, иако датотека коју сте тражили постоји. Исти ENOENT може значити и да недостаје интерпретатор скрипте, зато је први ред скрипте важан. У сваком случају порука именује слој, а третирање сваког „није пронађено“ као конфигурације која недостаје шаље истрагу у погрешном смеру. Наведите вредност грешке у тикету, јер она боље подноси препричавање од реченице око себе.
Шта не треба радити када се бинарни фајл не покреће
Гурање необјашњеног бинарног фајла кроз shell омотач не чини да се покрене. Не покрећите проверу зависности нехајно на датотеци којој не верујете, јер њено покретање у неким околностима може извршити код из бинарног фајла. Не додајте симболичке везе за учитавач, не мењајте библиотеке хоста и не преузимајте стари архив са огледала треће стране да бисте заобишли поруку. Свако од тога шири површину промене, а не дотиче неусклађеност коју је заглавље већ именовало.
Када се обраћате добављачу, пошаљите вредности а не причу: издање OS-а, архитектуру пакета, стрингове класе и машине, тражени интерпретатор и први ред грешке. Тај скуп решава питања подршке брже од снимка екрана инсталатера који пада. Стари артефакти и запамћени излази са форума нису актуелна матрица подршке, а након што се нативни бинарни фајл учита, профил, аутентификација и рутирање остају одвојен рад.