คำถามที่เกี่ยวข้อง:
เหตุใด windows exe จึงไม่ทำงานบน Linux
สามารถเรียกใช้.exeไฟล์Windows บน Linux ได้หรือไม่
ถ้าใช้สถาปัตยกรรมเดียวกันมันจะเป็นไปได้ไหม? เช่นถ้าโปรแกรมทั้งสองทำงานบนสถาปัตยกรรม X86 จะสามารถใช้ Windows .exeบน Linux ได้หรือไม่
คำถามที่เกี่ยวข้อง:
เหตุใด windows exe จึงไม่ทำงานบน Linux
สามารถเรียกใช้.exeไฟล์Windows บน Linux ได้หรือไม่
ถ้าใช้สถาปัตยกรรมเดียวกันมันจะเป็นไปได้ไหม? เช่นถ้าโปรแกรมทั้งสองทำงานบนสถาปัตยกรรม X86 จะสามารถใช้ Windows .exeบน Linux ได้หรือไม่
คำตอบ:
ไฟล์ 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
ระบบปฏิบัติการ (Windows หรือ Linux) ให้บริการกับแอพพลิเคชั่น ตัวอย่างเช่น Windows และ Linux จะมีฟังก์ชั่นที่แอปพลิเคชันสามารถเรียกใช้เพื่อเข้าถึงไฟล์เข้าถึงเครือข่ายเพื่อแสดงสิ่งต่าง ๆ บนหน้าจอ ฯลฯ
ระบบปฏิบัติการที่แตกต่างกันนำเสนอวิธีที่ต่างกันในการทำสิ่งเหล่านั้นดังนั้นแอปพลิเคชันที่ทำในแบบที่ Windows ใช้ไม่ได้บน Linux และในทางกลับกันแม้ว่าสถาปัตยกรรมของ CPU จะเหมือนกัน
มีเหตุผลหลักสามประการที่ไฟล์. exe จะไม่ทำงานบน Linux โดยตรงและทำไมไฟล์ปฏิบัติการ Linux จึงไม่สามารถทำงานบน Windows ได้โดยตรง
ที่แรกก็คือการเรียกระบบ การเรียกระบบนั้นเป็นไปตามแพลตฟอร์มที่เฉพาะเจาะจง อย่างไรก็ตามการเรียกใช้ระบบทั้งหมดจะไม่เหมือนกัน มีการเรียกระบบแบบพกพา (เช่นกำหนดโดยไลบรารีมาตรฐาน 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 ได้อย่างง่ายดาย
อีกรูปแบบหนึ่งคือรูปแบบที่ปฏิบัติการได้ Windows ใช้รูปแบบ PE (Portable Executable) และ Linux ใช้รูปแบบ ELF (Executable and Linkable) รูปแบบที่สามารถเรียกทำงานได้ประกอบด้วยข้อมูลเมตาและกำหนดวิธีการโหลดและเรียกใช้งานโดยแพลตฟอร์ม
วิธีแก้ปัญหา: เป็นไปได้ทั้งหมดที่จะเขียนตัวแปลง PE -> ELF หรือ ELF -> PE converter; และมันอาจไม่ยากเกินไปที่จะทำ (คำเตือน: ฉันไม่คุ้นเคยกับรูปแบบที่แท้จริงของทั้งสองรูปแบบ) อีกวิธีหนึ่งคือการเขียนตัวโหลดที่เรียกใช้งานได้ซึ่งสามารถเข้าใจไฟล์ PE (เช่น Wine มีหนึ่งตัว) หรือตัวโหลดที่เรียกใช้งานได้ที่สามารถเข้าใจไฟล์ ELF (ฉันเชื่อว่าการออกแบบ Windows จำกัด โอกาสที่ไฟล์แบบดับเบิลคลิกได้
การเรียกระบบการเรียกประชุม 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ฉันเชื่อว่าไวน์ทำสิ่งนี้
เฉพาะในกรณีที่เป็นไฟล์. exe ฉันสร้างแอพใน VS และคอมไพล์ภายใต้ Windows จากนั้นฉันก็รันบน Linux
mono myapp.exe
ฉันรู้ว่านี่ไม่ใช่สิ่งที่คุณกำลังมองหา แต่คำตอบคือคุณสามารถเรียกใช้ไฟล์ exe บางไฟล์บน Linux
วิธีเดียวในการเรียกใช้โปรแกรมปฏิบัติการบน Win, Linux (หรือแม้แต่ Mac) คือการมี "เลเยอร์เสมือน" บางอย่างระหว่างแอสเซมบลีและระบบปฏิบัติการตัวเลือกของlukasในการรันภายใต้โมโนเป็นวิธีหนึ่งที่เหมือนกับการสร้าง Java ไฟล์ (หรือแม้แต่ Adobe Air)
การสร้างไบนารี่ที่ทำงานนั้นเป็นไปไม่ได้ที่จะทำงานบนสถาปัตยกรรมหลาย ๆ อันเป็นไปไม่ได้เพราะรหัสเครื่องถูกผูกมัดอย่างสูงกับระบบปฏิบัติการและแม้กระทั่งฮาร์ดแวร์คุณอาจต้องสร้างบิวด์หลายอย่างสำหรับแต่ละระบบ / OS