나는 C #을 배우고 있으므로라는 작은 C # 프로그램을 만든 Hello, World!
다음 컴파일 mono-csc
하고 실행했습니다 mono
.
$ mono-csc Hello.cs
$ mono Hello.exe
Hello, World!
나는 명중 할 때 눈치 TAB
에 bash
, Hello.exe
실행 표시되었다. 실제로 파일 이름을로드하는 쉘만으로 실행됩니다!
Hello.exe
파일 확장자가 재미있는 ELF 파일 이 아닙니다 .
$ 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
이는 Microsoft Windows 정적으로 링크 된 실행 파일임을 의미합니다. Windows 상자에 놓으면 실행해야합니다.
내가 한 wine
설치하지만, wine
윈도우 응용 프로그램에 대한 호환성 계층되고, 약 5 배 오래 실행하는 데 걸리는 Hello.exe
로 mono
하고 직접 않습니다 실행, 그래서 그것은 아니에요 wine
그게 실행합니다.
나는 syscall / s 를 가로 채 거나로 시작하는 바이너리를 잡는 mono
커널 모듈이 설치되어 있다고 가정 하고 있지만 친구는 오류를 반환합니다.mono
exec
4D 5A
lsmod | grep mono
여기서 무슨 일이 일어나고 있으며 커널은 이 실행 파일이 특별 하다는 것을 어떻게 알 수 있습니까?
그냥 증거 것이 아니라 내 쉘 작업 마술, 내가 사용하는 쉘은 쓰레기를 (일명 sh
)을 실행하고 여전히 기본적으로 실행됩니다.
해설자가 호기심을 보였기 때문에 프로그램 전체가 다음과 같습니다.
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
입니다. 귀하의 경우 프로그램은 모노이지만 내 예제에는 php, python, perl 및 java가 포함됩니다. 모노가 .exe 파일 이외의 확장명을 코드를 통해 여전히 실행할 수 있는지 의심합니다. 컴파일 된 코드를 실행하기 때문에 창에 전혀 의존해서는 안됩니다. 그러나 소스 파일에 Windows 전용 API와 같은 종속 코드가있는 경우 분명히 해당 exe 파일을 실행하려면 와인이 필요합니다.
/etc/magic
또는 /usr/share/file/magic
(또는 비슷한 마법의 위치)이 작업을 수행하는 데 필요한 정보가 들어있는 파일이라는 것입니다.
$ foo.jar
오히려 할 수 $ java -jar foo.jar
있습니다.
php hello.php
이나python hello.py
또는perl hello.pl
자바와 같은 컴파일 언어의 경우에는 또는java hello
그들도 실행 가능하지만 읽기 프로그램들이 없습니다로 실행 파일을 실행할 것입니다. 당신이 실행 그러나 경우./hello.exe
대신mono hello.exe
.는 I는 경우에 확실히 binfmt 지원을 사용하여보다 합리적인 질문과 허용 대답을 (발견