Yükləmə səhifəsi 32 bit deyir, fayl Raspberry Pi-yə düşür və quraşdırıcı problemin faydalı heç bir hissəsini adlandırmayan mesajla uğursuz olur. İki tamamilə fərqli icra olunan fayl ELF mənasında hər ikisi 32 bit sayılır və onlardan yalnız biri həmin lövhədə işləyə bilər. Sinf sahəsi bir faktdır, maşın sahəsi başqa biri və fayl adı sizə heç birini etibarlı şəkildə demir. Kitabxananı dəyişməzdən və ya başqa güzgü sınamazdan əvvəl başlığı oxuyun.

Sinf söz ölçüsünü deyir, maşın əmr dəstini

Linux ELF məlumat kitabı fayl başlığında sinif sahəsi və maşın sahəsi təyin edir və bu ikisi fərqli suallara cavab verir. Sinf faylın 32 bit yoxsa 64 bit formasından istifadə etdiyini deyir; maşın isə hansı əmr dəsti üçün qurulduğunu. 32 bit x86 build ilə 32 bit ARM build birincidə razılaşır, ikincidə ayrılır. Düzgün söz ölçüsü vəd edən etiket belə prosessorun deşifrə edə bilmədiyi kodu çatdırır. Oxumağa dəyər üçüncü dəyər tələb olunan interpretatordur və binar onu bəyan etdikdə proqram başlıqları bunu adlandırır.

readelf -h -- ./vendor-vpn
readelf -l -- ./vendor-vpn
readelf -d -- ./vendor-vpn | grep NEEDED

Birinci əmr başlığı çap edir, ikinci faylda varsa proqram başlıqlarını çap edir, üçüncü isə yükləyicinin lazım olacağı paylaşılan obyektləri sadalayır. Sinfi, maşını və interpretatoru birlikdə qeyd edin, çünki bu üç dəyər bu qatda bütün uyğunluq məsələsidir. Üçündən heç biri yükləmə düyməsində görünmür, buna görə fayl təsvir edilməli deyil, yoxlanmalıdır.

Hansı interpretatoru nüvədən istəyir

İnterpretator bəyan edən icra olunan fayl nüvədən konkret bir yükləyici yolu istəyir. Həmin yükləyici olmadıqda, adını çəkdiyiniz fayl elə orada olsa da, işə salma uğursuz olur. İnsanların yükləmənin korlandığına qərar verdiyi nöqtə budur, halbuki əsl cavab distributivin təqdim etmədiyi yükləyicidir.

Yükləyicini həqiqətən işlətdiyiniz sistemə uyğunlaşdırın: OS buraxılışı, istifadəçi məkanı arxitekturası və yükləyicini təqdim edən paket. 64 bit nüvə 32 bit istifadəçi məkanını yalnız həmin məkan və onun yükləyicisi quraşdırıldıqda işlədə bilər, yəni prosessorun imkanları həlledici amil deyil. Bir qısa yoxlama interpretatoru tək sətirdə adlandırır və bu, dəstək bileti yazmaqdan az vaxt alır. Qabıq skripti yenə başqa cür uğursuz olur, çünki onun interpretatoru ELF başlığında deyil, birinci sətirdə adlanır və o sətri oxumaq heç nəyə başa gəlmir.

file --brief ./vendor-vpn

Yükləməni paket arxitekturasına uyğunlaşdırın

Distributiv paket arxitekturaları eyni fərqi öz lüğətlərində kodlaşdırır və satıcının dəstək bəyanatı məhz bu lüğətə istinad edir. Paket menecerinizin bildirdiyi dəyəri satıcının sənədləşdirdiyi dəyərlə müqayisə edin, marketinq etiketini fayl adı ilə müqayisə etmək əvəzinə. Problem yaradan cütlər amd64 ilə arm64, armhf ilə armel-dir, çünki hər cüt yükləmə siyahısında bir-birini əvəz edən görünür. x64 və ya ia32 ilə bitən fayl adı build hədəfini təsvir edir, onu saxlayan maşını yox.

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

Hər sətir söz ölçüsünün düzgün göründüyü, kodun isə yenə də səhv davrandığı, ya da başlayıb bir qat aşağıda uğursuz olduğu haldır. İnterpretator sütununu işarə deyil, sərt tələb kimi oxuyun, çünki nüvə həmin yolu kodunuzun hər hansı hissəsi icra olunmazdan əvvəl həll edir. Emulyasiya öz performans və dəstək nəticələri olan yerləşdirmə qərarıdır və daha geniş söz ölçüsü reklam edən prosessor tərəfindən heç vaxt nəzərdə tutulmur.

dpkg --print-architecture

ENOEXEC və ENOENT fərqli uğursuzluqlardır

İşə salma mərhələsi iki xətadan birini bildirir və onlar fərqli problemlərə işarə edir. Xəta dəyərini oxumaq, başqa heç nə işlətməzdən əvvəl uğursuzluğu təsnif edir.

ENOEXEC formatın tanınmadığını bildirir: səhv arxitektura, səhv sinif və ya heç icra olunan fayl olmayan bir şey. ELF faylında ENOENT adətən interpretatorun olmadığını bildirir, halbuki istədiyiniz fayl mövcuddur. Eyni ENOENT skriptin interpretatorunun yox olduğunu da bildirə bilər, buna görə skriptin birinci sətri vacibdir. Hər iki halda mesaj qatı adlandırır və hər «tapılmadı»nı çatışmayan konfiqurasiya kimi qəbul etmək araşdırmanı səhv istiqamətə yönəldir. Biletdə xəta dəyərini sitat gətirin, çünki o, ətrafındakı cümlədən daha yaxşı təkrar danışığa dözür.

Binar işə düşməyəndə nə etməməli

İzah olunmayan binarı qabıq sarğısından keçirməyə məcbur etmək onu işlətməz. Etibar etmədiyiniz faylda asılılıq yoxlayıcısını təsadüfən işlətməyin, çünki onu işlətmək bəzi hallarda binardan kod icra edə bilər. Mesajı aşmaq üçün yükləyici simvolik keçidləri əlavə etməyin, host kitabxanalarını dəyişməyin və ya üçüncü tərəf güzgüsündən köhnə arxiv gətirməyin. Bunların hər biri başlığın artıq adlandırdığı uyğunsuzluğa toxunmadan dəyişiklik sahəsini genişləndirir.

Satıcıya müraciət edəndə hekayə deyil, dəyərlər göndərin: OS buraxılışı, paket arxitekturası, sinif və maşın sətirləri, tələb olunan interpretator və ilk xəta sətri. Bu dəst dəstək suallarını uğursuz quraşdırıcının ekran şəklindən daha sürətli həll edir. Köhnə artefaktlar və yadda qalan forum çıxışları cari dəstək matrisi deyil və yerli binar yükləndikdən sonra profil, autentifikasiya və marşrutlaşdırma ayrı iş olaraq qalır.

Əlaqəli məqalələr