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-ը նշանակում է, որ ձևաչափը չի ճանաչվել՝ սխալ ճարտարապետություն, սխալ դաս կամ ինչ-որ բան, որ բոլորովին գործարկվող ֆայլ չէ։ ENOENT-ը ELF ֆայլի վրա սովորաբար նշանակում է, որ մեկնաբանը բացակայում է, թեև ձեր հայցած ֆայլը գոյություն ունի։ Նույն ENOENT-ը կարող է նաև նշանակել, որ սկրիպտի մեկնաբանը բացակայում է, դրա համար է կարևոր սկրիպտի առաջին տողը։ Ամեն դեպքում հաղորդագրությունը անվանում է շերտը, և ամեն «չի գտնվել»-ը որպես բացակայող կարգավորում դիտարկելը հետաքննությունն ուղարկում է սխալ ուղղությամբ։ Մեջբերեք սխալի արժեքը տոմսում, որովհետև այն ավելի լավ է դիմանում վերապատմելուն, քան շրջապատող նախադասությունը։
Ինչ չանել, երբ բինարը չի գործարկվում
Չբացատրված բինարը shell փաթաթանի միջով բռնի անցկացնելը չի ստիպում այն աշխատել։ Մի գործարկեք կախվածությունների ստուգիչը անփութորեն այն ֆայլի վրա, որին չեք վստահում, որովհետև դրա գործարկումը որոշ հանգամանքներում կարող է կոդ գործարկել բինարից։ Մի ավելացրեք բեռնիչի սիմվոլիկ հղումներ, մի փոխարինեք հոսթի գրադարանները և մի բերեք հին արխիվ երրորդ կողմի հայելուց՝ հաղորդագրությունը շրջանցելու համար։ Դրանցից յուրաքանչյուրը լայնացնում է փոփոխության մակերեսը՝ չշոշափելով այն անհամապատասխանությունը, որը վերնագիրն արդեն անվանել է։
Երբ դիմում եք մատակարարին, ուղարկեք արժեքներ, ոչ թե պատմություն՝ ՕՀ-ի թողարկումը, փաթեթի ճարտարապետությունը, դասի և մեքենայի տողերը, հայցվող մեկնաբանը և սխալի առաջին տողը։ Այդ հավաքածուն աջակցության հարցերը լուծում է ավելի արագ, քան ձախողվող տեղադրիչի էկրանի նկարը։ Հին արտեֆակտները և հիշված ֆորումի ելքերը ներկայիս աջակցության մատրիցա չեն, և երբ բնիկ բինարը բեռնվում է, պրոֆիլը, նույնականացումը և երթուղավորումը մնում են առանձին աշխատանք։