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
Эхний команд толгойг хэвлэнэ, хоёр дахь нь файлд байвал програмын толгойнуудыг хэвлэнэ, гурав дахь нь ачигчид хэрэгтэй болох хуваалцсан объектуудыг жагсаана. Класс, машин, интерпретаторыг хамт бичээрэй, учир нь эдгээр гурван утга нь энэ давхаргын нийт нийцлийн асуудал юм. Гурвын аль нь ч татах товч дээр харагдахгүй тул файлыг тайлбарлах бус шалгах хэрэгтэй.
Энэ нь цөмөөс аль интерпретаторыг хүсдэг вэ
Интерпретаторыг зарласан гүйцэтгэх файл цөмөөс нэг тодорхой ачигчийн замыг хүсдэг. Тэр ачигч байхгүй үед таны нэрлэсэн файл яг тэнд байсан ч эхлүүлэлт бүтэлгүйтдэг. Хүмүүс таталтыг гэмтсэн гэж шийддэг цэг энэ бөгөөд жинхэнэ хариулт нь түгээлт нийлүүлдэггүй ачигч юм.
Ачигчийг та бодитоор ажиллуулж буй системд тохируулаарай: OS хувилбар, хэрэглэгчийн орон зайн архитектур, ачигчийг нийлүүлдэг багц. 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 нь формат танигдаагүй гэсэн үг: буруу архитектур, буруу класс эсвэл огт гүйцэтгэх файл биш зүйл. ELF файл дээрх ENOENT нь ихэвчлэн интерпретатор дутуу гэсэн үг, таны хүссэн файл байгаа ч гэсэн. Мөн ENOENT нь скриптийн интерпретатор дутууг илэрхийлж болно, тиймээс скриптийн эхний мөр чухал. Ямар ч тохиолдолд мессеж давхаргын нэрлэдэг бөгөөд „олдоогүй“ бүрийг дутуу тохиргоо гэж үзэх нь мөрдөн шалгалтыг буруу чиглэл рүү илгээдэг. Тасалбарт алдааны утгыг иш татаарай, учир нь энэ нь эргэн ярихад эргэн тойрны өгүүлбэрээс илүү тэсвэртэй.
Бинар файл эхлэхгүй үед юу хийхгүй байх
Тайлбарлаагүй бинарыг shell бүрхүүлээр хүчээр нэвтрүүлэх нь түүнийг ажиллуулдаггүй. Та итгэдэггүй файл дээр хамаарал шалгагчийг хайхрамжгүй ажиллуулах хэрэггүй, учир нь түүнийг ажиллуулах нь зарим нөхцөлд бинараас код гүйцэтгэж болно. Ачигчийн симбол холбоос нэмэх, хост номын санг солих, мессежийг тойрохын тулд гуравдагч талын толиос хуучин архив татах хэрэггүй. Эдгээрийн аль нь ч толгойн аль хэдийн нэрлэсэн зөрүүд хүрэлгүйгээр өөрчлөлтийн талбарыг өргөжүүлдэг.
Нийлүүлэгчид хандахдаа түүх бус утгуудыг илгээгээрэй: OS хувилбар, багцын архитектур, класс ба машины мөрүүд, хүссэн интерпретатор, эхний алдааны мөр. Энэ багц нь дэмжлэгийн асуултуудыг бүтэлгүйтсэн суулгагчийн дэлгэцийн зурагнаас хурдан шийддэг. Хуучин олдворууд болон санаж үлдсэн форумын гаралт нь одоогийн дэмжлэгийн матриц биш бөгөөд уугуул бинар ачаалагдсаны дараа профайл, баталгаажуулалт, чиглүүлэлт нь тусдаа ажил хэвээр үлддэг.