เหตุใด windows exe จึงไม่ทำงานบน Linux


29

ฉันไม่ได้ถามเกี่ยวกับวิธีทำให้ Windows exe ทำงานใน Linux

ฉันถามทำไมมันไม่ทำงาน

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


คำตอบ:


45

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

ปัญหาคือ Windows และ Linux มีAPI ที่แตกต่างกันโดยสิ้นเชิงพวกเขามีส่วนต่อประสานเคอร์เนลและชุดของไลบรารีที่แตกต่างกัน ดังนั้นในการใช้งานแอพพลิเคชั่น Windows จริงๆลีนุกซ์จะต้องเลียนแบบการเรียก API ทั้งหมดที่แอปพลิเคชันทำ นั่นเป็นงานจำนวนมาก ไวน์ทำไปบ้าง แต่ก็ยากมากโดยเฉพาะอย่างยิ่งเนื่องจากผู้ผลิต Windows ไม่ให้ความร่วมมือ คุณสามารถเปรียบเทียบกับพูดเรียนภาษาอังกฤษได้เมื่อภาษาแม่ของคุณเป็นภาษาจีนรูปแบบที่สามารถใช้งานได้คือตัวอักษร (ไม่ยากที่จะเชี่ยวชาญ) API เป็นคำศัพท์ (ใช้เวลาหลายปีกว่าจะถึงระดับที่คุณสามารถเริ่มอ่านวรรณกรรม )


9
"คำศัพท์" เป็นการเปรียบเทียบที่ยอดเยี่ยม
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

ฉันคิดว่าคุณหมายถึงแตกต่างไปจากเดิมอย่างสิ้นเชิง
Mircea Chirea

Android ยังรองรับลินุกซ์ bnaries (ไม่ใช่แพ็คเกจ) ถ้ามันถูกคอมไพล์สำหรับ ARM เพราะมันใช้ลินุกซ์
Suici Doga

@SuiciDoga Sort of แต่มันซับซ้อนกว่านั้น เคอร์เนล Android สามารถเรียกใช้ลินุกซ์ไบนารี (ถ้าพวกเขากำลังรวบรวมสำหรับเคอร์เนล ABI ที่เหมาะสมเช่น wrt การใช้งานของการลงทะเบียน NEON) แต่ถ้าคุณต้องการเรียกใช้โปรแกรมที่เชื่อมโยงแบบไดนามิกคุณต้องติดตั้งห้องสมุดทั้งหมดเช่นกัน (และถ้าคุณทำเช่นนั้นคุณสามารถติดตั้งตัวจัดการแพคเกจได้เช่นกันดังนั้น“ ไบนารี แต่ไม่ใช่แพ็คเกจ” ไม่เป็นความจริงเลย)
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

ใช่ฉันรู้ว่าคุณต้องเปลี่ยนเส้นทางของห้องสมุดและอื่น ๆ
Suici Doga

14

ไบนารีของ Windows มีABI ที่แตกต่างกันและใช้API ที่แตกต่างจากไบนารีลินุกซ์

ลินุกซ์ไบนารีไม่จำเป็นต้องมีส่วนขยายเพราะ * nix ใช้บิตสิทธิ์ในการระบุปฏิบัติการแทนการขยาย


1
เห็นด้วยกับคำตอบ ... ข้อมูลเพิ่มเติมที่อาจเกี่ยวข้อง: ELF ( en.wikipedia.org/wiki/Executable_and_Linkable_Format ) vs PE ( en.wikipedia.org/wiki/PE_executable )
RobotHumans

ใช่แล้วมันต้องการตัวโหลดที่ต่างออกไปเช่นกัน en.wikipedia.org/wiki/Loader_%28computing%29
Ignacio Vazquez-Abrams

ฉันชอบข้อมูลชิ้นที่สองที่ขาดหายไปจากคำตอบของ @Gilles
Timothy Gu

@ IgnacioVazquez-Abrams นั่นน่าสนใจมาก ถ้าฉันบอกคุณว่าฉันเพิ่งรันเกม windows PlantsVsZombies.exe บน Ubuntu 16.04 Linux หรือเปล่า ฉันแค่ทำอย่างนั้นเพราะรู้สึกเบื่อที่รู้ว่ามันจะไม่เปิดตัว แต่มันทำได้และฉันสามารถเล่นได้อย่างสมบูรณ์แบบ นั่นเป็นไปไม่ได้เพราะเกมนั้นต้องการไอ API เพื่อให้ทำงานก่อนและมันไม่ชัดเจน มันเปิดตัวยังไง ??? ฉันควรตั้งคำถามใหม่สำหรับสิ่งนั้นหรือไม่?
Nikos

@ RestlessC0bra: ไวน์และโมโนเป็นสิ่งที่
Ignacio Vazquez-Abrams

0

นี่คือสิ่งที่ฉันได้ยินด้าน windows อธิบายในแง่ laymans จากโปรแกรมเมอร์

ใน Windows มี hooks ในโปรแกรมและระบบปฏิบัติการที่ exe โทรออกไปนั้นไม่ได้อยู่ใน Linux เนื่องจากความแตกต่างในสภาพแวดล้อมทั้งสอง เริ่มแรกลินุกซ์จะมองหาการอนุญาต Windows จะมองหารูปแบบที่เชื่อมโยงได้ก่อนโดยการตรวจสอบส่วนขยาย, ดูคุณสมบัติแล้วมองเข้าไปในไฟล์ exe เป็นต้น

มีแอปพลิเคชั่นเช่น Netbackup ที่เริ่มต้นใน linux และได้รับการแก้ไขให้ทำงานในสภาพแวดล้อมของ Windows โดยไม่ต้องใช้ไวน์ IMHO บ่อยครั้งเป็นแอพพลิเคชั่นที่เสถียรที่สุดของ Windows

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


2
ยังไงก็เถอะผมอยากจะเชื่อว่าบิลเกตส์ตอบคำถามของฉัน ;-)
Nav
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.