Tôi có thể chạy tệp Windows .exe trên Linux không? [bản sao]


12

Câu hỏi liên quan:
Tại sao các cửa sổ exe không hoạt động trên Linux?

Một .exetập tin Windows có thể chạy trên Linux không?

Nếu cùng một kiến ​​trúc được sử dụng sẽ là có thể? Giống như nếu cả hai chương trình chạy trên kiến ​​trúc X86, liệu có thể chạy Windows .exetrên Linux không?

Câu trả lời:


13

Tệp exe sẽ thực thi trong Linux hoặc Windows, nhưng không phải cả hai.

Thực thi trong Windows

Nếu tệp là tệp windows, nó sẽ không chạy trên Linux. Vì vậy, nếu đó là trường hợp, bạn có thể thử chạy nó dưới lớp tương thích Windows (Wine). Nếu nó không tương thích với rượu vang, thì bạn sẽ không thể thực thi nó trong Linux.

Trước khi bạn có thể bắt đầu, bạn sẽ cần cài đặt Wine. Các bước bạn cần để cài đặt Wine sẽ thay đổi theo nền tảng Linux mà bạn đang sử dụng. Bạn có thể có thể Google "Ubuntu cài đặt rượu vang", ví dụ, nếu bạn đang cài đặt Ubuntu.

Khi bạn đã cài đặt rượu vang, sau đó bạn có thể thực hiện các lệnh này.

wine xxx.exe

Thực thi theo Linux

Nếu bạn biết tệp này chạy trong linux, thì bạn sẽ muốn thực thi các lệnh sau:

Bạn sẽ muốn thay đổi quyền để cho phép tất cả người dùng e x ecute tệp này (a + x). bạn cũng có thể chỉ cho phép người dùng e x ecute (u + x)

chmod a+x xxx.exe

Khởi chạy chương trình, thông báo ./cho dòng lệnh tìm trong đường dẫn hiện tại để tệp thực thi (nếu thư mục 'hiện tại' không nằm trong biến môi trường $ PATH.

./xxx.exe

11

Hệ điều hành (Windows hoặc Linux) cung cấp dịch vụ cho các ứng dụng. Ví dụ: Windows và Linux sẽ có các chức năng mà ứng dụng có thể gọi để truy cập tệp, truy cập mạng, để hiển thị mọi thứ trên màn hình, v.v.

Các hệ điều hành khác nhau cung cấp các cách khác nhau để thực hiện những việc đó, vì vậy một ứng dụng theo cách Windows sẽ không hoạt động trên Linux và ngược lại, mặc dù kiến ​​trúc CPU là như nhau.


2
Câu trả lời này là chính xác. Đó không phải là lý do duy nhất (các trình tải khác nhau và các định dạng thực thi cũng là chìa khóa), nhưng đó là một trong số đó.
Matthew Flaschen

2
Đó là một trong những lý do chính khiến bạn không thể chạy cùng một cách thực thi trên các hệ điều hành khác nhau.

1
@Let_Me_Be: Thật ra bình luận của bạn không đúng.
0xA3

1
@ 0xA3 Nếu bạn đang truy cập API cụ thể của nền tảng thì có. Nhưng đối với hầu hết các phần, điều đó thực sự không đúng. Thực hiện lại thư viện chuẩn C hoặc C ++ thực sự rất đơn giản, bạn chỉ cần thực hiện lại các lỗi và chuyển hướng cuộc gọi. Điều cần nhiều công việc là định dạng tệp khác nhau (và API cụ thể của nền tảng vì chúng phải được thực hiện lại từ đầu).
Let_Me_Be

2
@Let, tôi chưa bao giờ nói bạn nên. Tôi đã chỉ ra rằng bạn nói "phần lớn", các chương trình không sử dụng API dành riêng cho nền tảng; trong thực tế, hầu hết làm . Ngay cả các chương trình sử dụng các thư viện đa nền tảng như GTK vẫn gián tiếp sử dụng API dành riêng cho nền tảng.
Matthew Flaschen

8

Không, các Hệ điều hành khác nhau sử dụng các định dạng khác nhau (ví dụ: Windows sử dụng PE trong khi linux sử dụng ELF). Ngoài ra, khi được biên dịch, chương trình của bạn thực hiện các cuộc gọi đến các phương thức HĐH gốc. Như đã đề cập, bạn có thể xem xét sử dụng RƯỢU . Nó cung cấp hầu hết các chức năng để chạy Windows binries trên Linux.


5

Có ba lý do chính khiến các tệp .exe không chạy trực tiếp trên Linux và tại sao tệp thực thi Linux sẽ không chạy trực tiếp trên Windows.

  1. Đầu tiên là các cuộc gọi hệ thống. Các cuộc gọi hệ thống, gần như theo định nghĩa, nền tảng cụ thể. Tuy nhiên, không phải tất cả các cuộc gọi hệ thống đều được thực hiện như nhau. Có các cuộc gọi hệ thống di động (ví dụ: được xác định bởi thư viện chuẩn C / C ++) và các cuộc gọi hệ thống không di động (ví dụ: được xác định bởi POSIX hoặc Microsoft). Các ứng dụng được liên kết tĩnh tại thời điểm biên dịch với các thư viện hệ thống sẽ thấy rằng phần mã được bao gồm tĩnh có thể sẽ không có cơ hội thực thi chính xác trong nền tảng đích do thiết kế nền tảng rất khác nhau. Các ứng dụng được liên kết động trong thời gian chạy sẽ có cơ hội chạy với một số điều kiện: nếu đó là hệ thống di động, có một bảng dịch giữa các cuộc gọi hệ thống của nhị phân ban đầu đến các cuộc gọi hệ thống của nền tảng đích; nếu đó là cuộc gọi hệ thống không di động,1 , các nền tảng khác nhau có bộ tính năng khác nhau và một số tính năng không có ý nghĩa trong nền tảng khác 2 ).

    Giải pháp: Để chạy chương trình Windows trong Linux, Wine cung cấp triển khai các cuộc gọi hệ thống Windows và Thư viện hệ thống Windows, nó cũng nhận dạng định dạng PE; Wine có thể chạy chương trình Windows trong Linux mà không cần biên dịch lại. Đối với chương trình Linux trong Windows, Cygwin cung cấp triển khai các lệnh gọi Hệ thống POSIX trong Windows và nó cho phép chương trình được viết cho Linux được biên dịch lại bằng Cygwin GCC để chạy trên hệ thống Windows mà không cần thay đổi mã nguồn. Do tính chất nguồn mở của hầu hết các chương trình Linux, việc biên dịch lại dễ dàng hơn thay vì đi theo cách cung cấp lớp tương thích nhị phân của Wine. Không thể cung cấp lớp tương thích giống như rượu vang, tuy nhiên cách của Cygwin mạnh mẽ hơn và không có nhiều ổ đĩa để cho phép chương trình Linux không nguồn mở dễ dàng được chuyển sang Windows.

  2. Khác là định dạng thực thi. Windows sử dụng định dạng PE (Portable Executable) và Linux sử dụng ELF (Executable và Linkable Format). Định dạng thực thi chứa siêu dữ liệu và xác định cách thức thực thi được tải và thực thi bởi nền tảng.

    Giải pháp: Hoàn toàn có thể viết bộ chuyển đổi PE -> ELF hoặc ELF -> PE; và có lẽ không quá khó để làm như vậy (cảnh báo: Tôi không quen với định dạng thực tế của một trong hai). Một cách khác là viết một trình tải thực thi có thể hiểu các tệp PE (ví dụ Wine cung cấp một) hoặc trình tải thực thi có thể hiểu tệp ELF (Tôi tin rằng thiết kế của Windows giới hạn khả năng tệp có thể nhấp đúp chạy tự nhiên như một tệp thực thi)

  3. Hệ thống gọi hội nghị gọi. Linux và Windows không chỉ có một tập hợp các cuộc gọi hệ thống khả dụng khác nhau, nó còn có một quy ước gọi cuộc gọi hệ thống rất khác. Trong Linux, để thực hiện một cuộc gọi hệ thống, bạn phải vượt qua số tòa nhà trong thanh ghi eax / rax và các đối số trong phần còn lại của các thanh ghi, và sau đó bạn thực hiện yêu cầu ngắt 0x80. Trong DOS, bạn cũng truyền các đối số trong thanh ghi, tuy nhiên, có một số yêu cầu ngắt khác nhau cho mỗi dịch vụ hệ thống để bạn không chuyển số cuộc gọi hệ thống trong eax / rax. Windows NT tương tự như Linux, tuy nhiên thay vì 0x80, bạn đưa ra yêu cầu ngắt 0x2E, tuy nhiên số cuộc gọi hệ thống vẫn khác nhau (vì vậy bạn cần một bảng dịch số thứ tự và có thể là lớp tương thích).

    Giải pháp: Ngay cả khi bạn không có mã tự sửa đổi hoặc cố gắng thực thi dữ liệu dưới dạng mã hoặc thực hiện các mã khó khăn khác, vẫn rất khó (khó như giải quyết vấn đề Dừng) để phân tích một tệp thực thi, tìm kiếm tất cả hệ thống gọi các yêu cầu ngắt và dịch chúng sang các cuộc gọi hệ thống của nền tảng đích. Một cách dễ dàng hơn là cung cấp dịch vụ thời gian chạy để xử lý các yêu cầu ngắt của chương trình và chuyển hướng chúng đến các cuộc gọi hệ thống của nền tảng đích 3 .

Có nhiều lý do khác, nhưng tôi tin rằng ba điều này là những vấp ngã lớn.

Bảo mật hệ thống 1 tập tin xuất hiện, không có cách nào để dịch giữa các bit bảo mật của Linux và NTFS ACL của Windows.

2 Windows không thể rẽ nhánh một quá trình; CreatProcess phần nào có thể được sử dụng để mô phỏng ngã ba tuy nhiên nó làm mất ngữ nghĩa sao chép khi ghi. Không có cách nào để thực hiện quá trình tạo bản sao trên Windows.

3 Tôi tin rằng Wine làm điều này


1

Có thể tra cứu rượu


paul @ tôi không muốn rượu vang ... tôi đang nói về lập trình ... sau khi tôi nhận được một tệp thực thi sau khi biên dịch. điều đó có thể chạy được trên cả cửa sổ và linux không

1
Bài viết trên wikipedia cung cấp chi tiết cấp cao về lý do tại sao RƯỢU được yêu cầu.
Paul Whelan

1

Chỉ khi nó là một tệp .Net .exe. Tôi đã tạo một ứng dụng trong VS và được biên dịch trong Windows, sau đó tôi chạy nó trên Linux

mono myapp.exe

Tôi biết đây không phải là chính xác những gì bạn đang tìm kiếm, nhưng câu trả lời là bạn có thể chạy một số tệp exe trên Linux.


1

Cách duy nhất để chạy các tệp thực thi trên Win, Linux (hoặc thậm chí Mac) là có một loại "lớp ảo" nào đó giữa các lệnh và hội đồng quản trị, tùy chọn chạy của lukas theo Mono là một cách để đi, giống như xây dựng Java tệp (hoặc thậm chí là Adobe Air).

Việc xây dựng các nhị phân chạy, như vậy, để chạy trên một số kiến ​​trúc là không thể vì mã máy được liên kết chặt chẽ với HĐH và thậm chí cả phần cứng, bạn có thể phải thực hiện một số bản dựng cho mỗi hệ thống / HĐH.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.