Pemasang VPN berkata 32-bit: periksa pengepala ELF sebaliknya
Saiz perkataan tidak mengenal pasti set arahan. Prosedur membaca kelas, mesin dan jurubahasa, kemudian meminta build yang sepadan dengan hos.
Halaman muat turun berkata 32-bit, fail mendarat di Raspberry Pi, dan pemasang gagal dengan mesej yang tidak menamakan mana-mana bahagian masalah yang berguna. Dua fail boleh laku yang sama sekali berbeza kedua-duanya dikira 32-bit dalam erti ELF, dan hanya satu daripadanya boleh berjalan pada papan itu. Medan kelas ialah satu fakta, medan mesin ialah satu lagi, dan nama fail tidak memberitahu anda kedua-duanya dengan pasti. Baca pengepala sebelum menukar pustaka atau mencuba cermin lain.
Kelas menyebut saiz perkataan, mesin menyebut set arahan
Rujukan ELF Linux mentakrifkan medan kelas dan medan mesin dalam pengepala fail, dan kedua-duanya menjawab soalan yang berbeza. Kelas menyebut sama ada fail menggunakan bentuk 32-bit atau 64-bit; mesin menyebut untuk set arahan mana ia dibina. Build x86 32-bit dan build ARM 32-bit bersetuju pada yang pertama dan berbeza pada yang kedua. Itulah cara label yang menjanjikan saiz perkataan betul tetap menghantar kod yang pemproses tidak dapat menyahkod. Nilai ketiga yang wajar dibaca ialah jurubahasa yang diminta, yang dinamakan oleh pengepala program apabila binari menyatakan satu.
readelf -h -- ./vendor-vpn
readelf -l -- ./vendor-vpn
readelf -d -- ./vendor-vpn | grep NEEDED
Perintah pertama mencetak pengepala, yang kedua mencetak pengepala program apabila fail mempunyainya, dan yang ketiga menyenaraikan objek kongsi yang akan diperlukan oleh pemuat. Catat kelas, mesin dan jurubahasa bersama-sama, kerana ketiga-tiga nilai itu ialah keseluruhan persoalan keserasian pada lapisan ini. Tiada satu pun daripada ketiga-tiganya muncul pada butang muat turun, kerana itu fail mesti diperiksa, bukan diterangkan.
Jurubahasa mana yang dimintanya daripada kernel
Fail boleh laku yang menyatakan jurubahasa meminta kernel satu laluan pemuat tertentu. Apabila pemuat itu tiada, pelancaran gagal walaupun fail yang anda namakan berada tepat di situ. Di sinilah orang membuat keputusan bahawa muat turun itu rosak, sedangkan jawapan sebenar ialah pemuat yang tidak disediakan oleh edaran.
Padankan pemuat dengan sistem yang benar-benar anda jalankan: keluaran OS, seni bina ruang pengguna dan pakej yang menyediakan pemuat. Kernel 64-bit boleh menjalankan ruang pengguna 32-bit hanya apabila ruang itu dan pemuatnya dipasang, jadi keupayaan pemproses bukan faktor penentu. Satu pemeriksaan ringkas menamakan jurubahasa dalam satu baris, dan ia mengambil masa lebih singkat daripada tiket sokongan. Skrip shell gagal dengan cara lain pula, kerana jurubahasanya dinamakan pada baris pertama dan bukan dalam pengepala ELF, dan membaca baris itu tidak memakan apa-apa.
file --brief ./vendor-vpn
Padankan muat turun dengan seni bina pakej
Seni bina pakej edaran mengekod perbezaan yang sama dalam istilah mereka sendiri, dan istilah itulah yang dirujuk oleh pernyataan sokongan vendor. Bandingkan nilai yang dilaporkan oleh pengurus pakej anda dengan nilai yang didokumenkan oleh vendor, bukan membandingkan label pemasaran dengan nama fail. Pasangan yang menimbulkan masalah ialah amd64 lawan arm64, dan armhf lawan armel, kerana setiap pasangan kelihatan boleh ditukar ganti dalam senarai muat turun. Nama fail yang berakhir dengan x64 atau ia32 menerangkan sasaran build, bukan mesin yang menyimpannya.
| 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 |
Setiap baris ialah kes apabila saiz perkataan kelihatan betul dan kod masih berkelakuan salah, atau apabila ia bermula dan kemudian gagal satu lapisan lebih rendah. Baca lajur jurubahasa sebagai keperluan keras bukan petunjuk, kerana kernel menyelesaikan laluan itu sebelum mana-mana bahagian kod anda berjalan. Emulasi ialah keputusan penggunaan dengan akibat prestasi dan sokongannya sendiri, dan ia tidak pernah tersirat oleh pemproses yang mengiklankan saiz perkataan lebih lebar.
dpkg --print-architecture
ENOEXEC dan ENOENT ialah kegagalan yang berbeza
Peringkat pelancaran melaporkan salah satu daripada dua ralat, dan kedua-duanya menunjuk kepada masalah yang berbeza. Membaca nilai ralat mengelaskan kegagalan sebelum anda menjalankan apa-apa yang lain.
ENOEXEC bermaksud format tidak dikenali: seni bina salah, kelas salah atau sesuatu yang sama sekali bukan fail boleh laku. ENOENT pada fail ELF biasanya bermaksud jurubahasa tiada, walaupun fail yang anda minta wujud. ENOENT yang sama juga boleh bermaksud jurubahasa sesuatu skrip tiada, kerana itu baris pertama skrip penting. Walau apa pun mesej itu menamakan lapisan, dan memperlakukan setiap „tidak ditemui“ sebagai konfigurasi yang hilang menghantar penyiasatan ke arah yang salah. Petik nilai ralat dalam tiket, kerana ia bertahan lebih baik apabila diceritakan semula daripada ayat di sekelilingnya.
Apa yang tidak patut dilakukan apabila binari tidak bermula
Memaksa binari yang tidak dijelaskan melalui pembalut shell tidak membuatkannya berjalan. Jangan menjalankan pemeriksa kebergantungan secara sambil lewa pada fail yang anda tidak percayai, kerana menjalankannya boleh melaksanakan kod daripada binari dalam keadaan tertentu. Jangan tambah pautan simbolik pemuat, jangan tukar pustaka hos dan jangan ambil arkib lama daripada cermin pihak ketiga untuk melepasi mesej. Setiap satu daripada itu meluaskan permukaan perubahan tanpa menyentuh ketidakpadanan yang telah dinamakan oleh pengepala.
Apabila menghubungi vendor, hantar nilai bukan cerita: keluaran OS, seni bina pakej, rentetan kelas dan mesin, jurubahasa yang diminta dan baris ralat pertama. Set itu menyelesaikan soalan sokongan lebih cepat daripada tangkapan skrin pemasang yang gagal. Artifak lama dan output forum yang diingati bukan matriks sokongan semasa, dan sebaik sahaja binari asli dimuatkan, profil, pengesahan dan laluan kekal sebagai kerja berasingan.