Tôi đang học C #, vì vậy tôi đã tạo một chương trình C # nhỏ nói rằng Hello, World!, sau đó biên dịch nó mono-cscvà chạy nó với mono:
$ mono-csc Hello.cs
$ mono Hello.exe
Hello, World!
Tôi nhận thấy rằng khi tôi nhấn TABvào bash, Hello.exeđã được đánh dấu thực thi. Thật vậy, nó chạy bằng một vỏ tải tên tệp!
Hello.exelà không một file ELF có phần mở rộng tập tin buồn cười:
$ readelf -a Hello.exe
readelf: Error: Not an ELF file - it has the wrong magic bytes at the start
$ xxd Hello.exe | head -n1
00000000: 4d5a 9000 0300 0000 0400 0000 ffff 0000 MZ..............
MZcó nghĩa là Microsoft Windows được thực thi liên kết tĩnh. Thả nó vào một hộp Windows và nó sẽ (nên) chạy.
Tôi đã winecài đặt, nhưng wine, là một lớp tương thích với các ứng dụng Windows, mất khoảng 5x thời gian để chạy Hello.exenhư monovà thực hiện nó trực tiếp làm, vì vậy nó không winechạy nó.
Tôi giả sử có một số monomô-đun hạt nhân được cài đặt với chức mononăng chặn các tòa nhà exec/ s hoặc bắt các nhị phân bắt đầu bằng 4D 5A, nhưng lsmod | grep monobạn bè trả lại lỗi.
Chuyện gì đang xảy ra ở đây, và làm thế nào để nhân biết rằng này thực thi là đặc biệt?
Để chứng minh đó không phải là phép thuật hoạt động của vỏ của tôi , tôi đã sử dụng Crap Shell (hay còn gọi là sh) để chạy nó và nó vẫn chạy tự nhiên.
Đây là chương trình đầy đủ, vì một người bình luận tò mò:
using System;
class Hello {
/// <summary>
/// The main entry point for the application
/// </summary>
[STAThread]
public static void Main(string[] args) {
System.Console.Write("Hello, World!\n");
}
}
program codefile, trong trường hợp chương trình của bạn là đơn sắc, trong khi các ví dụ của tôi bao gồm php, python, perl và java. Tôi nghi ngờ nếu mono cho phép mở rộng ra ngoài tệp .exe vẫn được thực thi thông qua mã. Nó không nên phụ thuộc vào tất cả trên các cửa sổ vì cuối cùng điều này được thực thi một mã được biên dịch. Tuy nhiên, nếu tệp nguồn của bạn có một số mã phụ thuộc như API chỉ có windows thì rõ ràng bạn phải cần rượu để chạy tệp exe đó.
/etc/magichoặc /usr/share/file/magic(hoặc vị trí ma thuật tương tự) là tệp chứa thông tin cần thiết để có thể làm điều này.
$ foo.jarthay vì $ java -jar foo.jar- tương tự như những gì được thực hiện cho đơn âm.
php hello.phphoặcpython hello.pyhoặcperl hello.plhoặc trong trường hợp ngôn ngữ biên dịch như javajava hellohọ cũng sẽ chạy như họ không thực thi có nhưng một chương trình đọc và thực thi tập tin. Tuy nhiên, nếu bạn chạy./hello.exethay vìmono hello.exetôi thấy câu hỏi của bạn và chấp nhận câu trả lời hợp lý hơn (trong trường hợp chắc chắn sử dụng binfmt-support.