VPN орнатушы 32-bit дейді: оның орнына ELF тақырыбын тексеріңіз
Сөз өлшемі командалар жиынын анықтамайды. Класс, машина және интерпретаторды оқу, содан кейін хостқа сәйкес келетін build сұрау тәртібі.
Жүктеу беті 32-bit дейді, файл Raspberry Pi-ге түседі, ал орнатушы мәселенің ешбір пайдалы бөлігін атамайтын хабарламамен сәтсіз аяқталады. Екі мүлде басқа орындалатын файл ELF мағынасында екеуі де 32-bit болып саналады және олардың тек біреуі ғана сол тақтада жұмыс істей алады. Класс өрісі — бір факт, машина өрісі — екіншісі, ал файл атауы сізге екеуін де сенімді түрде айтпайды. Кітапхананы ауыстырмас немесе басқа айнаны сынамас бұрын тақырыпты оқыңыз.
Класс сөз өлшемін айтады, машина командалар жиынын
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
Бірінші команда тақырыпты шығарады, екіншісі файлда болса бағдарлама тақырыптарын шығарады, ал үшіншісі жүктеушіге қажет болатын ортақ объектілерді тізіп береді. Класс, машина және интерпретаторды бірге жазып алыңыз, өйткені осы үш мән осы қабаттағы бүкіл үйлесімділік мәселесі. Үшеуінің ешқайсысы жүктеу түймесінде көрінбейді, сондықтан файлды сипаттау емес, тексеру қажет.
Ол ядродан қай интерпретаторды сұрайды
Интерпретаторды жариялайтын орындалатын файл ядродан бір нақты жүктеуші жолын сұрайды. Ол жүктеуші болмаса, сіз атаған файл дәл сол жерде тұрса да іске қосу сәтсіз аяқталады. Бұл — адамдар жүктемені бүлінген деп шешетін сәт, ал шын жауап таратушы ұсынбайтын жүктеуші.
Жүктеушіні сіз шынымен іске қосатын жүйеге сәйкестендіріңіз: ОЖ шығарылымы, пайдаланушы кеңістігінің архитектурасы және жүктеушіні ұсынатын пакет. 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 пішім танылмағанын білдіреді: қате архитектура, қате класс немесе мүлде орындалатын файл емес нәрсе. ELF файлындағы ENOENT әдетте интерпретатор жоқ екенін білдіреді, сіз сұраған файл бар болса да. Сол ENOENT скрипт интерпретаторының жоқ екенін де білдіруі мүмкін, сондықтан скрипттің бірінші жолы маңызды. Қалай болғанда да хабарлама қабатты атайды, ал әрбір «табылмады» дегенді жоқ конфигурация ретінде қабылдау тергеуді дұрыс емес бағытқа жібереді. Билетте қате мәнін келтіріңіз, өйткені ол айналасындағы сөйлемнен гөрі қайта айтуға жақсы төзеді.
Бинарлық файл іске қосылмағанда не істемеу керек
Түсіндірілмеген бинарлық файлды shell қабығынан күштеп өткізу оны іске қоспайды. Сенімсіз файлда тәуелділік тексерушісін абайсыз іске қоспаңыз, өйткені оны іске қосу кейбір жағдайларда бинарлық файлдан код орындауы мүмкін. Жүктеушінің символдық сілтемелерін қоспаңыз, хост кітапханаларын ауыстырмаңыз және хабарламадан өту үшін үшінші тарап айнасынан ескі мұрағат алмаңыз. Осылардың әрқайсысы өзгеріс аймағын кеңейтеді, бірақ тақырып атап қойған сәйкессіздікке тимейді.
Жеткізушіге жүгінгенде әңгіме емес, мәндер жіберіңіз: ОЖ шығарылымы, пакет архитектурасы, класс және машина жолдары, сұралған интерпретатор және бірінші қате жолы. Бұл жиынтық қолдау сұрақтарын сәтсіз орнатушының скриншотынан жылдам шешеді. Ескі артефактілер мен есте қалған форум шығыстары ағымдағы қолдау матрицасы емес, ал жергілікті бинарлық файл жүктелгеннен кейін профиль, аутентификация және маршруттау бөлек жұмыс болып қалады.