Инсталаторот на 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, архитектурата на пакетот, низите за класа и машина, бараниот интерпретатор и првиот ред со грешка. Тој сет ги решава прашањата за поддршка побрзо од снимка од екран на инсталатор што не успева. Старите артефакти и запаметените излези од форуми не се актуелна матрица за поддршка, и штом се вчита нативна бинарна датотека, профилот, автентикацијата и рутирањето остануваат одделна работа.