Bir indirme sayfası 32-bit diyor, dosya bir Raspberry Pi'ye iniyor ve kurucu, sorunun yararlı hiçbir parçasını adlandırmayan bir mesajla başarısız oluyor. Birbirinden tamamen farklı iki çalıştırılabilir dosya da ELF anlamında 32-bit sayılıyor ve bunlardan yalnızca biri o kartta çalışabiliyor. Sınıf alanı bir olgu, makine alanı başka bir olgu ve bir dosya adı size ikisini de güvenilir biçimde söylemez. Bir kitaplığı değiştirmeden ya da başka bir aynayı denemeden önce başlığı okuyun.

Sınıf sözcük boyutunu söyler, makine komut kümesini söyler

Linux ELF başvurusu dosya başlığında bir sınıf alanı ve bir makine alanı tanımlar ve bu ikisi farklı soruları yanıtlar. Sınıf, dosyanın 32-bit mi 64-bit mi biçimi kullandığını söyler; makine, hangi komut kümesi için derlendiğini söyler. 32-bit x86 derlemesi ile 32-bit ARM derlemesi ilkinde anlaşır, ikincisinde ayrılır. Böylece doğru sözcük boyutunu vaat eden bir etiket yine de işlemcinin çözemediği kod teslim eder. Okumaya değer üçüncü değer, ikili bir tane bildirdiğinde program başlıklarının adlandırdığı istenen yorumlayıcıdır.

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

İlk komut başlığı yazdırır, ikincisi dosyada varsa program başlıklarını yazdırır, üçüncüsü yükleyicinin ihtiyaç duyacağı paylaşılan nesneleri listeler. Sınıfı, makineyi ve yorumlayıcıyı birlikte not edin, çünkü bu üç değer bu katmandaki uyumluluk sorusunun tamamıdır. Üçünden hiçbiri bir indirme düğmesinde görünmez, bu yüzden dosya betimlenmeli değil incelenmelidir.

Çekirdekten hangi yorumlayıcıyı ister

Yorumlayıcı bildiren bir çalıştırılabilir dosya çekirdekten belirli bir yükleyici yolu ister. O yükleyici yoksa, adını verdiğiniz dosya tam orada olsa bile başlatma başarısız olur. İnsanların indirmenin bozuk olduğuna karar verdiği nokta burasıdır, oysa gerçek yanıt dağıtımın sağlamadığı bir yükleyicidir.

Yükleyiciyi gerçekten çalıştırdığınız sisteme uydurun: işletim sistemi sürümü, kullanıcı alanı mimarisi ve yükleyiciyi sağlayan paket. 64 bit çekirdek, 32 bit kullanıcı alanını ancak o alan ve yükleyicisi kuruluysa çalıştırabilir, bu yüzden işlemcinin yetenekleri belirleyici etken değildir. Kısa bir denetim yorumlayıcıyı tek satırda adlandırır ve bir destek kaydından daha az zaman alır. Kabuk betiği yine başka türlü başarısız olur, çünkü yorumlayıcısı ELF başlığında değil ilk satırda adlandırılır ve o satırı okumak hiçbir şeye mal olmaz.

file --brief ./vendor-vpn

İndirmeyi paket mimarisine uydurun

Dağıtımların paket mimarileri aynı ayrımı kendi sözlüklerinde kodlar ve bir satıcının destek açıklaması tam da o sözlüğe atıfta bulunur. Paket yöneticinizin bildirdiği değeri satıcının belgelediği değerle karşılaştırın, bir pazarlama etiketini dosya adıyla karşılaştırmak yerine. Sorun çıkaran çiftler amd64 ile arm64 ve armhf ile armel'dir, çünkü her çift bir indirme listesinde birbirinin yerine geçebilir görünür. x64 veya ia32 ile biten bir dosya adı bir derleme hedefini betimler, onu tutan makineyi değil.

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

Her satır, sözcük boyutunun doğru göründüğü ve kodun yine de yanlış davrandığı ya da başlayıp sonra bir katman aşağıda başarısız olduğu bir durumdur. Yorumlayıcı sütununu bir ipucu değil katı bir gereksinim olarak okuyun, çünkü çekirdek bu yolu kodunuzun herhangi bir parçası çalışmadan önce çözer. Emülasyon, kendi başarım ve destek sonuçları olan bir dağıtım kararıdır ve daha geniş bir sözcük boyutu reklamı yapan bir işlemci tarafından asla ima edilmez.

dpkg --print-architecture

ENOEXEC ve ENOENT farklı başarısızlıklardır

Başlatma aşaması iki hatadan birini bildirir ve bunlar farklı sorunlara işaret eder. Hata değerini okumak, başka bir şey çalıştırmadan önce başarısızlığı sınıflandırır.

ENOEXEC biçimin tanınmadığı anlamına gelir: yanlış mimari, yanlış sınıf ya da hiç çalıştırılabilir dosya olmayan bir şey. Bir ELF dosyasında ENOENT genellikle yorumlayıcının eksik olduğu anlamına gelir, istediğiniz dosya var olsa bile. Aynı ENOENT bir betiğin yorumlayıcısının da eksik olduğunu gösterebilir, bu yüzden bir betiğin ilk satırı önemlidir. Her durumda ileti katmanı adlandırır ve her «bulunamadı» durumunu eksik yapılandırma saymak soruşturmayı yanlış yöne gönderir. Hata değerini kayıtta alıntılayın, çünkü çevresindeki cümleden daha iyi yeniden anlatıma dayanır.

İkili dosya başlamadığında neler yapılmamalı

Açıklanmamış bir ikili dosyayı bir kabuk sarmalayıcısından zorla geçirmek onu çalıştırmaz. Güvenmediğiniz bir dosyada bağımlılık denetleyicisini gelişigüzel çalıştırmayın, çünkü çalıştırılması bazı durumlarda ikili dosyadan kod yürütebilir. Yükleyici sembolik bağlantıları eklemeyin, ana makine kitaplıklarını değiştirmeyin ve iletiyi atlamak için üçüncü taraf aynasından eski bir arşiv indirmeyin. Bunların her biri, değişiklik yüzeyini genişletir ama başlığın zaten adlandırdığı uyuşmazlığa dokunmaz.

Satıcıya başvurduğunuzda hikâye değil değerler gönderin: işletim sistemi sürümü, paket mimarisi, sınıf ve makine dizeleri, istenen yorumlayıcı ve ilk hata satırı. Bu küme destek sorularını başarısız bir kurucunun ekran görüntüsünden daha hızlı çözer. Eski artefaktlar ve hatırlanan forum çıktıları güncel bir destek matrisi değildir ve yerel bir ikili dosya yüklendikten sonra profil, kimlik doğrulama ve yönlendirme ayrı iş olarak kalır.

İlgili makaleler