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-csc
và 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 TAB
và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.exe
là 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..............
MZ
có 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 đã wine
cà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.exe
như mono
và thực hiện nó trực tiếp làm, vì vậy nó không wine
chạy nó.
Tôi giả sử có một số mono
mô-đun hạt nhân được cài đặt với chức mono
nă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 mono
bạ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/magic
hoặ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.jar
thay vì $ java -jar foo.jar
- tương tự như những gì được thực hiện cho đơn âm.
php hello.php
hoặcpython hello.py
hoặcperl hello.pl
hoặc trong trường hợp ngôn ngữ biên dịch như javajava hello
họ 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.exe
thay vìmono hello.exe
tô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.