Жүктөө барагы 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 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

Ар бир сап — сөз өлчөмү туура көрүнгөн менен код дагы эле туура эмес иштеген, же ал башталып, анан бир катмар төмөн ийгиликсиз аяктаган учур. Интерпретатор тилкесин көрсөтмө эмес, катуу талап катары окуңуз, анткени ядро бул жолду сиздин коддун кайсы бир бөлүгү аткарылганга чейин чечет. Эмуляция — өзүнүн өндүрүмдүүлүк жана колдоо кесепеттери бар жайгаштыруу чечими, жана аны кененирээк сөз өлчөмүн жарнамалаган процессор эч качан мензебейт.

dpkg --print-architecture

ENOEXEC жана ENOENT ар башка ийгиликсиздиктер

Иштетүү баскычы эки катанын бири тууралуу билдирет, жана алар ар башка маселелерди көрсөтөт. Ката маанисин окуу башка нерсени иштеткенге чейин ийгиликсиздикти классификациялайт.

ENOEXEC формат табылбаганын билдирет: туура эмес архитектура, туура эмес класс же такыр аткарылуучу файл эмес нерсе. ELF файлындагы ENOENT адатта интерпретатор жок экенин билдирет, сиз сураган файл бар болсо да. Ошол ENOENT скрипттин интерпретатору жок экенин да билдириши мүмкүн, ошондуктан скрипттин биринчи сабы маанилүү. Кандай болбосун билдирүү катмарды атайт, ал эми ар бир «табылган жок» дегенди жок конфигурация катары кабыл алуу иликтөөнү туура эмес багытка салат. Билтетте ката маанисин келтириңиз, анткени ал айланасындагы сүйлөмгө караганда кайра айтууга жакшы туруштук берет.

Бинардык файл иштетилбегенде эмне кылбаш керек

Түшүндүрүлбөгөн бинардык файлды shell кабыгынан зордук менен өткөрүү аны иштетпейт. Ишенбеген файлда көз карандылык текшерүүчүсүн этиятсыз иштетпеңиз, анткени аны иштетүү кээ бир шарттарда бинардык файлдан кодду аткарышы мүмкүн. Жүктөөчүнүн символдук шилтемелерин кошпоңуз, хост китепканаларын алмаштырбаңыз жана билдирүүнү айланып өтүү үчүн үчүнчү тараптын күзгүсүнөн эски архив албаңыз. Алардын ар бири өзгөртүү аймагын кеңейтет, бирок аталыш атап койгон шайкешсиздикке тийбейт.

Жеткирүүчүгө кайрылганда аңгеме эмес, маанилерди жөнөтүңүз: ОС чыгарылышы, пакет архитектурасы, класс жана машина саптары, суралган интерпретатор жана биринчи ката сабы. Бул топтом колдоо суроолорун ийгиликсиз орнотуучунун скриншотуна караганда тезирээк чечет. Эски артефактылар жана эсте калган форум чыгарылыштары учурдагы колдоо матрицасы эмес, ал эми жергиликтүү бинардык файл жүктөлгөндөн кийин профиль, аутентификация жана маршруттоо өзүнчө жумуш бойдон калат.

Тектеш макалалар