ไม่สามารถเรียกใช้โปรแกรม 32 บิตบน VM 64 บิต


12

ฉันรวบรวมโปรแกรม C "hello world" ขนาดเล็กบนเครื่อง Ubuntu 10.04 32 บิต จากนั้นฉันวางไฟล์ปฏิบัติการ (a.out) บน Ubuntu 12.10 (64 บิต) เครื่องเสมือน VMWare และพยายามเรียกใช้งาน (./ a.out) ระบบปฏิบัติการไม่ได้ระบุไฟล์และระบุว่า 'ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว' แต่เมื่อฉันใส่ไฟล์ปฏิบัติการแบบเดียวกันบน Ubuntu 12.10 (64 บิต) ที่ทำงานบนแล็ปท็อป 64 บิตมันทำงานได้ดีและฉันได้ผลลัพธ์ที่ต้องการ VM กำลังทำงานบน IBM Blade Servers ฉันอยากรู้ว่าทำไมผลลัพธ์สำหรับ VM

คำตอบ:


20

ข้อความที่ไม่ได้หมายถึงแฟ้มที่ปฏิบัติการของคุณ:No such file or directory a.outแต่หมายถึงโปรแกรมผู้ช่วยเหลือที่จำเป็นต้องเรียกใช้ปฏิบัติการที่เชื่อมโยงแบบ 32 บิตa.outแทน

ตอนนี้ฉันพบสิ่งเหล่านี้อธิบายได้ดีมากในบทความดีนี้:

การเชื่อมโยงแบบคงที่และแบบไดนามิก

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

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

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


3
ข้อความแสดงข้อผิดพลาด "ไม่พบไฟล์" นี้ทำให้ฉันสับสนเช่นกันในครั้งแรกที่°͜°จากนั้นฉันเข้าใจว่าหมายถึงไฟล์บางส่วนที่แอพต้องการโดยแอปขาดหายไป
Ramchandra Apte

@Radu Rădeanuคุณเรียกโปรแกรมผู้ช่วยอะไร ฉันเดาไลบรารี่ที่เชื่อมโยงแบบไดนามิก ถ้าเป็นเช่นนั้นการเรียกมันว่าเป็นโปรแกรมผู้ช่วยทำให้ยุ่งเหยิงคำอธิบาย
golem

นี่คือลิงค์ที่ฉันพบว่ามีประโยชน์สำหรับการทำความเข้าใจปัญหานี้ - การได้รับข้อความ“ ไม่พบ” เมื่อรันไบนารีแบบ 32 บิตบนระบบ 64 บิต
golem
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.