Ambele fișiere sunt pe 32 de biți și doar unul dintre ele rulează pe placa ta. O compilare ELF32 pentru Intel și o compilare ELF32 pentru ARM sunt de acord asupra câmpului clasei și nu sunt de acord asupra a tot ce contează. O pagină de descărcare care oferă o opțiune pe 32 de biți nu ți-a spus aproape nimic până nu citești antetul fișierului pe care l-ai descărcat efectiv. Redenumirea lui nu schimbă nici o instrucțiune.

Clasa și mașina răspund la întrebări diferite

Câmpul clasei spune dacă fișierul folosește structuri pe 32 sau pe 64 de biți. Câmpul mașinii numește setul de instrucțiuni pentru care a fost compilat fișierul. Citirea doar a primului este modul în care o compilare x86 ajunge pe o placă ARM cu un nume de fișier care pare perfect plauzibil. Ambele valori provin din aceeași comandă, de aceea e atât de ușor să sari peste una.

Aceeași confuzie se aplică etichetelor de 64 de biți, unde aarch64 și x86-64 împart o dimensiune de cuvânt și nici o instrucțiune. O pagină a furnizorului care listează o singură descărcare pe 64 de biți descrie propria compilare, nu mașina ta. Verifică antetul fișierului, nu titlul coloanei din pagină.

readelf -h ./vendor-vpn
readelf -l ./vendor-vpn | head -20
file ./vendor-vpn

Prima comandă afișează antetul, inclusiv clasa și mașina. A doua arată antetele de program, unde se află o cerere de interpretor. A treia îți dă o singură linie când un tabel e mai mult decât ai nevoie.

Adăugarea permisiunii de execuție sau corectarea unei verificări de distribuție nu traduce nimic. Emularea, acolo unde platforma o susține, este o decizie de implementare cu propriul cost de performanță și dependențe.

Citește antetul înainte de a rula instalatorul

Inspectează un artefact de încredere înainte de a executa ceva din el. Un instalator care eșuează la jumătate poate lăsa biblioteci înlocuite și nimic funcțional, ceea ce este un punct de plecare mai rău decât arhiva cu care ai început. Inspecția antetului este doar citire și reversibilă în sensul că nimic din sistem nu se schimbă.

Compară câmpul mașinii cu arhitectura pachetelor sistemului care rulează, nu cu numele de marketing al plăcii. Un procesor pe 64 de biți care rulează un spațiu de utilizator pe 32 de biți are nevoie de compilarea pe 32 de biți, iar acel detaliu decide care descărcare este nativă. Capacitatea plăcii nu este constrângerea; spațiul de utilizator instalat este.

dpkg --print-architecture
uname -m
getconf LONG_BIT

Prima comandă raportează arhitectura pentru care sistemul instalează pachete, iar aceea este valoarea care trebuie să corespundă. Celelalte două descriu nucleul și dimensiunea cuvântului, și pot diferi de spațiul de utilizator într-o instalare multi-arhitectură.

Când aceste răspunsuri diferă, decide pe care îl susține furnizorul înainte de a descărca altă arhivă. Ghicitul produce o buclă de instalări care eșuează fiecare în alt punct, iar fiecare eșec pare o problemă nouă.

Verifică interpretorul, nu doar arhitectura

Un executabil dinamic înregistrează în antetul de program încărcătorul pe care îl așteaptă. Pe un sistem cu altă cale de încărcare, nucleul refuză să pornească fișierul chiar dacă câmpul mașinii corespunde exact. Acesta este eșecul care trimite oamenii să caute biblioteci lipsă.

Mesajul de eroare îți spune în ce caz ești, iar cele două cazuri sunt ușor de confundat. O respingere de format sau arhitectură diferă de un fișier sau interpretor lipsă, și doar unul dintre ele se rezolvă instalând alt pachet.

readelf -l ./vendor-vpn | grep -A1 INTERP
ls -l /lib64/ld-linux-x86-64.so.2

Prima comandă arată calea interpretorului cerută de binar. A doua verifică dacă acea cale există, ceea ce separă o compilare greșită de un încărcător lipsă.

Nu rula un listator de dependențe pe un binar neîncrezut, deoarece unele implementări pot executa fișierul pe care îl inspectează. Menține inspecția doar citire și rezistă tentației de a adăuga legături simbolice pentru încărcător ca să pornești o compilare neacceptată.

Cere o compilare cu faptele în mână

Trimite furnizorului versiunea sistemului de operare, arhitectura pachetelor, valorile clasei și ale mașinii și primul mesaj de eroare. Acea combinație obține un răspuns util, în timp ce o captură de ecran a unui eșec generic obține un șablon de asistență.

Ține întrebarea despre binar separată de întrebarea despre configurație. Odată ce compilarea corectă pornește, profilurile, acreditările și rutele rămân problemele lor, iar nicio cantitate de editare a profilului nu va face un binar cu arhitectură greșită să ruleze.

Articole similare