ฉันสามารถเรียกใช้ไฟล์ Windows .exe บน Linux ได้หรือไม่ [ซ้ำ]


12

คำถามที่เกี่ยวข้อง:
เหตุใด windows exe จึงไม่ทำงานบน Linux

สามารถเรียกใช้.exeไฟล์Windows บน Linux ได้หรือไม่

ถ้าใช้สถาปัตยกรรมเดียวกันมันจะเป็นไปได้ไหม? เช่นถ้าโปรแกรมทั้งสองทำงานบนสถาปัตยกรรม X86 จะสามารถใช้ Windows .exeบน Linux ได้หรือไม่

คำตอบ:


13

ไฟล์ exe จะทำงานภายใต้ Linux หรือ Windows แต่ไม่ใช่ทั้งสองอย่าง

ดำเนินการภายใต้ Windows

หากไฟล์เป็นไฟล์ windows ไฟล์นั้นจะไม่ทำงานภายใต้ Linux ด้วยตัวเอง ดังนั้นหากเป็นเช่นนั้นคุณสามารถลองใช้งานได้ภายใต้เลเยอร์ความเข้ากันได้ของ Windows (ไวน์) หากไม่เข้ากันได้กับไวน์คุณจะไม่สามารถดำเนินการภายใต้ Linux ได้

ก่อนที่คุณจะเริ่มคุณจะต้องติดตั้งไวน์ ขั้นตอนที่คุณต้องติดตั้ง Wine จะแตกต่างกันไปตามแพลตฟอร์ม Linux ที่คุณใช้งาน คุณอาจใช้ Google "Ubuntu ติดตั้งไวน์" ตัวอย่างเช่นถ้าคุณกำลังติดตั้ง Ubuntu

เมื่อคุณติดตั้งไวน์แล้วคุณจะสามารถดำเนินการคำสั่งเหล่านี้ได้

wine xxx.exe

ดำเนินการภายใต้ Linux

หากคุณรู้ว่าไฟล์นี้ทำงานภายใต้ linux คุณจะต้องใช้คำสั่งเหล่านี้:

คุณจะต้องการที่จะเปลี่ยนสิทธิ์ที่จะอนุญาตให้ผู้ใช้ทุกคน E x ecute ไฟล์นี้ (A + x) คุณสามารถอนุญาตให้ผู้ใช้ e x ecute (u + x)

chmod a+x xxx.exe

เปิดโปรแกรม./บอกให้บรรทัดคำสั่งมองหาพา ธ ปัจจุบันเพื่อให้ไฟล์ดำเนินการ (หากไดเรกทอรี 'ปัจจุบัน' ไม่อยู่ในตัวแปรสภาพแวดล้อม $ PATH

./xxx.exe

11

ระบบปฏิบัติการ (Windows หรือ Linux) ให้บริการกับแอพพลิเคชั่น ตัวอย่างเช่น Windows และ Linux จะมีฟังก์ชั่นที่แอปพลิเคชันสามารถเรียกใช้เพื่อเข้าถึงไฟล์เข้าถึงเครือข่ายเพื่อแสดงสิ่งต่าง ๆ บนหน้าจอ ฯลฯ

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


2
คำตอบนี้ถูกต้อง ไม่ใช่เหตุผลเดียว (รูปแบบที่แตกต่างกันและรูปแบบที่สามารถเรียกใช้งานได้เป็นกุญแจสำคัญ) แต่เป็นหนึ่งในนั้น
Matthew Flaschen

2
เป็นหนึ่งในสาเหตุหลักที่คุณไม่สามารถรันการปฏิบัติการที่เหมือนกันบนระบบปฏิบัติการที่แตกต่างกัน

1
@Let_Me_Be: ความคิดเห็นของคุณไม่ถูกต้อง
0xA3

1
@ 0xA3 หากคุณกำลังเข้าถึง API เฉพาะแพลตฟอร์มแล้วใช่ แต่ส่วนใหญ่แล้วมันไม่จริงเลย การปรับใช้ไลบรารีมาตรฐาน C หรือ C ++ ใหม่ง่ายมากจริง ๆ คุณเพียงแค่ต้องใช้บักและเปลี่ยนเส้นทางการโทรอีกครั้ง สิ่งที่ต้องทำงานมากมายคือรูปแบบไฟล์ที่แตกต่าง (และ API เฉพาะของแพลตฟอร์มเนื่องจากต้องนำมาใช้ใหม่ตั้งแต่เริ่มต้น)
ŠimonTóth

2
@ ให้ฉันไม่เคยพูดว่าคุณควร ฉันกำลังชี้ให้เห็นว่าคุณพูดว่า "ส่วนใหญ่" โปรแกรมไม่ได้ใช้ API เฉพาะแพลตฟอร์ม ในความเป็นจริงมากที่สุดทำ แม้แต่โปรแกรมที่ใช้ไลบรารีข้ามแพลตฟอร์มเช่น GTK ยังคงใช้ API เฉพาะแพลตฟอร์มโดยทางอ้อม
Matthew Flaschen

8

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


5

มีเหตุผลหลักสามประการที่ไฟล์. exe จะไม่ทำงานบน Linux โดยตรงและทำไมไฟล์ปฏิบัติการ Linux จึงไม่สามารถทำงานบน Windows ได้โดยตรง

  1. ที่แรกก็คือการเรียกระบบ การเรียกระบบนั้นเป็นไปตามแพลตฟอร์มที่เฉพาะเจาะจง อย่างไรก็ตามการเรียกใช้ระบบทั้งหมดจะไม่เหมือนกัน มีการเรียกระบบแบบพกพา (เช่นกำหนดโดยไลบรารีมาตรฐาน C / C ++) และการเรียกระบบที่ไม่ใช่แบบพกพา (เช่นกำหนดโดย POSIX หรือ Microsoft) แอปพลิเคชันที่เชื่อมโยงแบบคงที่ในเวลารวบรวมกับไลบรารีระบบจะพบว่าส่วนหนึ่งของรหัสที่รวมอยู่ในแบบคงที่อาจไม่มีโอกาสในการดำเนินการอย่างถูกต้องในแพลตฟอร์มเป้าหมายเนื่องจากการออกแบบแพลตฟอร์มที่แตกต่างกันอย่างมากมาย แอปพลิเคชันที่เชื่อมโยงแบบไดนามิกที่รันไทม์มีโอกาสที่จะทำงานโดยมีเงื่อนไขเล็กน้อย: ถ้าเป็นการเรียกระบบแบบพกพาจะมีตารางการแปลระหว่างการเรียกระบบของไบนารีดั้งเดิมไปยังการเรียกระบบของแพลตฟอร์มเป้าหมาย ถ้าเป็นการเรียกระบบที่ไม่ใช่แบบพกพา1 , แพลตฟอร์มที่แตกต่างกันมีชุดคุณสมบัติที่แตกต่างกันและคุณลักษณะบางอย่างไม่สมเหตุสมผลในแพลตฟอร์มอื่น2 )

    วิธีแก้ไข: สำหรับการรันโปรแกรม Windows ใน Linux ไวน์ให้การใช้งาน Windows System Calls และ Windows System Libraries นอกจากนี้ยังรู้จักรูปแบบ PE Wine สามารถเรียกใช้โปรแกรม Windows ใน Linux ได้โดยไม่ต้องคอมไพล์ใหม่ สำหรับโปรแกรมลีนุกซ์ใน Windows, Cygwin ให้การใช้งานการเรียก POSIX System ใน Windows, และอนุญาตให้โปรแกรมที่เขียนสำหรับ Linux สามารถคอมไพล์ใหม่โดยใช้ Cygwin GCC เพื่อรันบนระบบ Windows โดยไม่มีการเปลี่ยนแปลงซอร์สโค้ด เนื่องจากลักษณะโอเพนซอร์ซของโปรแกรม Linux ส่วนใหญ่จึงง่ายต่อการคอมไพล์ใหม่แทนที่จะไปตามวิธีของ Wine ในการจัดหาเลเยอร์ที่เข้ากันได้กับไบนารี มันเป็นไปไม่ได้ที่จะให้เลเยอร์ความเข้ากันได้เหมือนไวน์ แต่วิธีของ Cygwin นั้นแข็งแกร่งกว่าและมีไดรฟ์ไม่มากนักที่อนุญาตให้โปรแกรม Linux ที่ไม่ได้เป็นโอเพ่นซอร์สสามารถเชื่อมต่อกับ Windows ได้อย่างง่ายดาย

  2. อีกรูปแบบหนึ่งคือรูปแบบที่ปฏิบัติการได้ Windows ใช้รูปแบบ PE (Portable Executable) และ Linux ใช้รูปแบบ ELF (Executable and Linkable) รูปแบบที่สามารถเรียกทำงานได้ประกอบด้วยข้อมูลเมตาและกำหนดวิธีการโหลดและเรียกใช้งานโดยแพลตฟอร์ม

    วิธีแก้ปัญหา: เป็นไปได้ทั้งหมดที่จะเขียนตัวแปลง PE -> ELF หรือ ELF -> PE converter; และมันอาจไม่ยากเกินไปที่จะทำ (คำเตือน: ฉันไม่คุ้นเคยกับรูปแบบที่แท้จริงของทั้งสองรูปแบบ) อีกวิธีหนึ่งคือการเขียนตัวโหลดที่เรียกใช้งานได้ซึ่งสามารถเข้าใจไฟล์ PE (เช่น Wine มีหนึ่งตัว) หรือตัวโหลดที่เรียกใช้งานได้ที่สามารถเข้าใจไฟล์ ELF (ฉันเชื่อว่าการออกแบบ Windows จำกัด โอกาสที่ไฟล์แบบดับเบิลคลิกได้

  3. การเรียกระบบการเรียกประชุม Linux และ Windows ไม่เพียง แต่มีการเรียกใช้ระบบที่แตกต่างกัน แต่ยังมีระเบียบการโทรที่แตกต่างกันมาก ใน Linux หากต้องการโทรออกระบบคุณต้องส่งหมายเลข syscall ใน eax / rax register และการโต้แย้งในส่วนที่เหลือของการลงทะเบียนจากนั้นคุณจะทำการร้องขอขัดจังหวะ 0x80 ใน DOS คุณจะส่งผ่านข้อโต้แย้งในการลงทะเบียนอย่างไรก็ตามมีหมายเลขคำขอขัดจังหวะที่แตกต่างกันสำหรับแต่ละบริการของระบบดังนั้นคุณจะไม่ผ่านหมายเลขการโทรระบบใน eax / rax Windows NT นั้นคล้ายกับ Linux มากกว่า แต่แทนที่จะเป็น 0x80 คุณจะเพิ่มคำขอขัดจังหวะ 0x2E อย่างไรก็ตามหมายเลขการโทรของระบบยังคงแตกต่างกัน (ดังนั้นคุณต้องใช้ตารางการแปลหมายเลข syscall และอาจเป็นเลเยอร์ที่ใช้งานร่วมกันได้)

    วิธีการแก้ไข: แม้ว่าคุณจะไม่มีรหัสแก้ไขตัวเองหรือพยายามที่จะประมวลผลข้อมูลเป็นรหัสหรือทำรหัสที่ซับซ้อนอื่น ๆ มันก็ยังยากมาก (ยากพอ ๆ กับการแก้ปัญหา Halting) เพื่อวิเคราะห์การปฏิบัติการ เรียกคำขอขัดจังหวะและแปลให้เป็นการเรียกระบบของแพลตฟอร์มเป้าหมาย วิธีที่ง่ายกว่าคือการให้บริการรันไทม์ที่จัดการการร้องขอการขัดจังหวะของโปรแกรมและเปลี่ยนเส้นทางไปยังแพลตฟอร์มระบบเป้าหมายเรียก3

มีเหตุผลอื่น ๆ อีกมากมาย แต่ฉันเชื่อว่าทั้งสามนี้เป็นบล็อกที่สะดุด

ความปลอดภัยของระบบไฟล์1อยู่ในใจไม่มีทางที่จะแปลระหว่างบิตความปลอดภัยของ Linux และ NTFS ACL ของ Windows

2 Windows ไม่สามารถแยกกระบวนการได้ CreateProcess สามารถใช้ค่อนข้างเลียนแบบส้อม แต่มันจะสูญเสียความหมายของการคัดลอกเมื่อเขียน ไม่มีวิธีในการสร้างกระบวนการคัดลอกเมื่อเขียนใน Windows

3ฉันเชื่อว่าไวน์ทำสิ่งนี้


1

มันเป็นไวน์ที่เป็นไปได้ในการค้นหา


พอล @ ฉันไม่ต้องการไวน์ ... ฉันกำลังพูดถึงการเขียนโปรแกรม ... หลังจากที่ฉันได้รับการปฏิบัติการหลังจากการรวบรวม ปฏิบัติการที่สามารถเรียกใช้บนทั้งหน้าต่างและ linux

1
บทความวิกิพีเดียให้รายละเอียดในระดับสูงว่าทำไมจึงต้องมีไวน์
พอลเวแลน

1

เฉพาะในกรณีที่เป็นไฟล์. exe ฉันสร้างแอพใน VS และคอมไพล์ภายใต้ Windows จากนั้นฉันก็รันบน Linux

mono myapp.exe

ฉันรู้ว่านี่ไม่ใช่สิ่งที่คุณกำลังมองหา แต่คำตอบคือคุณสามารถเรียกใช้ไฟล์ exe บางไฟล์บน Linux


1

วิธีเดียวในการเรียกใช้โปรแกรมปฏิบัติการบน Win, Linux (หรือแม้แต่ Mac) คือการมี "เลเยอร์เสมือน" บางอย่างระหว่างแอสเซมบลีและระบบปฏิบัติการตัวเลือกของlukasในการรันภายใต้โมโนเป็นวิธีหนึ่งที่เหมือนกับการสร้าง Java ไฟล์ (หรือแม้แต่ Adobe Air)

การสร้างไบนารี่ที่ทำงานนั้นเป็นไปไม่ได้ที่จะทำงานบนสถาปัตยกรรมหลาย ๆ อันเป็นไปไม่ได้เพราะรหัสเครื่องถูกผูกมัดอย่างสูงกับระบบปฏิบัติการและแม้กระทั่งฮาร์ดแวร์คุณอาจต้องสร้างบิวด์หลายอย่างสำหรับแต่ละระบบ / OS

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