หน้าดาวน์โหลดบอกว่า 32-bit ไฟล์ไปลงบน Raspberry Pi และตัวติดตั้งล้มเหลวพร้อมข้อความที่ไม่ได้ระบุส่วนใดที่เป็นประโยชน์ของปัญหา ไฟล์เรียกทำงานสองไฟล์ที่ต่างกันโดยสิ้นเชิงนับเป็น 32-bit ทั้งคู่ในความหมายของ ELF และมีเพียงไฟล์เดียวเท่านั้นที่รันบนบอร์ดนั้นได้ ฟิลด์คลาสเป็นข้อเท็จจริงหนึ่ง ฟิลด์เครื่องเป็นอีกข้อเท็จจริงหนึ่ง และชื่อไฟล์ไม่ได้บอกคุณทั้งสองอย่างอย่างน่าเชื่อถือ อ่านส่วนหัวก่อนที่จะเปลี่ยนไลบรารีหรือลองกระจกอื่น

คลาสบอกขนาดของคำ เครื่องบอกชุดคำสั่ง

เอกสารอ้างอิง ELF ของ Linux กำหนดฟิลด์คลาสและฟิลด์เครื่องไว้ในส่วนหัวของไฟล์ และทั้งสองตอบคำถามที่ต่างกัน คลาสบอกว่าไฟล์ใช้รูปแบบ 32-bit หรือ 64-bit เครื่องบอกว่าสร้างขึ้นสำหรับชุดคำสั่งใด การสร้าง x86 แบบ 32-bit และการสร้าง ARM แบบ 32-bit ตรงกันในข้อแรกและต่างกันในข้อที่สอง นี่คือวิธีที่ป้ายซึ่งสัญญาว่าขนาดคำถูกต้องยังคงส่งโค้ดที่โปรเซสเซอร์ถอดรหัสไม่ได้ ค่าที่สามที่ควรอ่านคือตัวแปลคำสั่งที่ร้องขอ ซึ่งส่วนหัวของโปรแกรมจะระบุเมื่อไบนารีประกาศไว้

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

คำสั่งแรกพิมพ์ส่วนหัว คำสั่งที่สองพิมพ์ส่วนหัวของโปรแกรมเมื่อไฟล์มี และคำสั่งที่สามแสดงรายการออบเจ็กต์ที่แชร์ซึ่งตัวโหลดจะต้องใช้ บันทึกคลาส เครื่อง และตัวแปลคำสั่งไว้ด้วยกัน เพราะค่าทั้งสามนี้คือคำถามเรื่องความเข้ากันได้ทั้งหมดในชั้นนี้ ไม่มีค่าใดในสามค่าปรากฏบนปุ่มดาวน์โหลด ดังนั้นจึงต้องตรวจสอบไฟล์แทนการบรรยาย

มันขอตัวแปลคำสั่งใดจากเคอร์เนล

ไฟล์เรียกทำงานที่ประกาศตัวแปลคำสั่งจะขอเส้นทางตัวโหลดหนึ่งเส้นทางที่เฉพาะเจาะจงจากเคอร์เนล เมื่อไม่มีตัวโหลดนั้น การเปิดโปรแกรมจะล้มเหลวแม้ว่าไฟล์ที่คุณระบุจะอยู่ตรงนั้นก็ตาม นี่คือจุดที่ผู้คนตัดสินว่าการดาวน์โหลดเสียหาย ขณะที่คำตอบจริงคือ ตัวโหลดที่ดิสทริบิวชันไม่ได้จัดหาให้

จับคู่ตัวโหลดกับระบบที่คุณเรียกใช้จริง ทั้งรุ่นของระบบปฏิบัติการ สถาปัตยกรรมของพื้นที่ผู้ใช้ และแพ็กเกจที่จัดหาตัวโหลด เคอร์เนล 64-bit สามารถเรียกใช้พื้นที่ผู้ใช้ 32-bit ได้ก็ต่อเมื่อพื้นที่นั้นและตัวโหลดติดตั้งอยู่ ดังนั้นความสามารถของโปรเซสเซอร์จึงไม่ใช่ปัจจัยชี้ขาด การตรวจสอบสั้น ๆ หนึ่งครั้งระบุตัวแปลคำสั่งในบรรทัดเดียว และใช้เวลาน้อยกว่าตั๋วสนับสนุน สคริปต์เชลล์ล้มเหลวอีกวิธีหนึ่ง เพราะตัวแปลคำสั่งถูกระบุในบรรทัดแรกไม่ใช่ในส่วนหัว ELF และการอ่านบรรทัดนั้นไม่มีค่าใช้จ่าย

file --brief ./vendor-vpn

จับคู่การดาวน์โหลดกับสถาปัตยกรรมของแพ็กเกจ

สถาปัตยกรรมแพ็กเกจของดิสทริบิวชันเข้ารหัสความแตกต่างเดียวกันในคำศัพท์ของตนเอง และคำศัพท์นั้นคือสิ่งที่คำแถลงการสนับสนุนของผู้จำหน่ายอ้างถึง เปรียบเทียบค่าที่ตัวจัดการแพ็กเกจของคุณรายงานกับค่าที่ผู้จำหน่ายจัดทำเอกสาร แทนที่จะเปรียบเทียบป้ายการตลาดกับชื่อไฟล์ คู่ที่สร้างปัญหาคือ amd64 กับ arm64 และ armhf กับ armel เพราะแต่ละคู่ดูเหมือนใช้แทนกันได้ในรายการดาวน์โหลด ชื่อไฟล์ที่ลงท้ายด้วย x64 หรือ ia32 อธิบายเป้าหมายการสร้าง ไม่ใช่เครื่องที่เก็บไฟล์นั้น

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

แต่ละแถวคือกรณีที่ขนาดของคำดูถูกต้องและโค้ดยังคงทำงานผิด หรือกรณีที่เริ่มทำงานแล้วล้มเหลวในชั้นถัดลงไป อ่านคอลัมน์ตัวแปลคำสั่งเป็นข้อกำหนดที่เข้มงวดไม่ใช่คำใบ้ เพราะเคอร์เนลแก้เส้นทางนั้นก่อนที่โค้ดส่วนใดของคุณจะทำงาน การจำลองเป็นการตัดสินใจติดตั้งที่มีผลต่อประสิทธิภาพและการสนับสนุนของตัวเอง และโปรเซสเซอร์ที่โฆษณาขนาดคำกว้างกว่าไม่เคยบ่งบอกถึงมัน

dpkg --print-architecture

ENOEXEC และ ENOENT เป็นความล้มเหลวที่ต่างกัน

ขั้นตอนการเปิดโปรแกรมรายงานข้อผิดพลาดหนึ่งในสองอย่าง และทั้งสองชี้ไปที่ปัญหาที่ต่างกัน การอ่านค่าข้อผิดพลาดจะจำแนกความล้มเหลวก่อนที่คุณจะเรียกใช้อะไรอื่น

ENOEXEC หมายถึงรูปแบบไม่ถูกจดจำ สถาปัตยกรรมผิด คลาสผิด หรือบางสิ่งที่ไม่ใช่ไฟล์เรียกทำงานเลย ENOENT บนไฟล์ ELF โดยปกติหมายถึงตัวแปลคำสั่งหายไป แม้ว่าไฟล์ที่คุณขอจะมีอยู่ก็ตาม ENOENT เดียวกันยังอาจหมายถึงตัวแปลคำสั่งของสคริปต์หายไป ซึ่งเป็นเหตุผลที่บรรทัดแรกของสคริปต์สำคัญ ไม่ว่าจะอย่างไรข้อความระบุชั้นข้อมูล และการถือว่าทุก «ไม่พบ» เป็นการกำหนดค่าที่หายไปจะส่งการสอบสวนไปในทิศทางที่ผิด อ้างค่าข้อผิดพลาดในตั๋ว เพราะมันทนต่อการเล่าซ้ำได้ดีกว่าประโยครอบข้าง

สิ่งที่ไม่ควรทำเมื่อไบนารีไม่เริ่มทำงาน

การบังคับไบนารีที่ไม่ได้รับการอธิบายผ่านตัวห่อเชลล์ไม่ได้ทำให้มันทำงาน อย่าเรียกใช้ตัวตรวจสอบการพึ่งพาอย่างไม่ระวังบนไฟล์ที่คุณไม่ไว้วางใจ เพราะการเรียกใช้อาจเรียกโค้ดจากไบนารีในบางสถานการณ์ อย่าเพิ่มลิงก์สัญลักษณ์ของตัวโหลด อย่าสลับไลบรารีของโฮสต์ และอย่าดึงไฟล์เก่าจากกระจกของบุคคลที่สามเพื่อหลีกเลี่ยงข้อความ แต่ละอย่างเหล่านี้ขยายพื้นผิวการเปลี่ยนแปลงโดยไม่แตะความไม่ตรงกันที่ส่วนหัวระบุไว้แล้ว

เมื่อติดต่อผู้จำหน่าย ให้ส่งค่าไม่ใช่เรื่องเล่า รุ่นของระบบปฏิบัติการ สถาปัตยกรรมของแพ็กเกจ สตริงคลาสและเครื่อง ตัวแปลคำสั่งที่ร้องขอ และบรรทัดข้อผิดพลาดแรก ชุดนี้แก้คำถามด้านการสนับสนุนได้เร็วกว่าภาพหน้าจอของตัวติดตั้งที่ล้มเหลว อาร์ติแฟกต์เก่าและผลลัพธ์ฟอรัมที่จำได้ไม่ใช่เมทริกซ์การสนับสนุนปัจจุบัน และเมื่อไบนารีเนทีฟโหลดแล้ว โปรไฟล์ การพิสูจน์ตัวตน และการกำหนดเส้นทางยังคงเป็นงานแยกต่างหาก

บทความที่เกี่ยวข้อง