방금 아주 놀라운 사실을 발견했습니다.
csc
Windows 컴퓨터(Visual Studio에서)에서 간단한 C# hello world를 컴파일하고 결과 exe
파일을 Linux 컴퓨터에 복사한 다음 mono helloworld.exe
.이 게시물Windows에서는 helloworld.exe
기본적으로 C# 런타임을 시작하는 트릭일 뿐이며 CIL 바이트코드는 파일 뒷부분의 일부 데이터 부분에서 읽혀집니다 exe
. 마찬가지로 Linux에서는 mono helloworld.exe
exe 스푸핑에 대한 걱정 없이 C# 런타임을 실행하고 바이트코드를 직접 읽을 수 있다고 생각합니다 .
후손을 위해 제가 출처로 삼은 내용은 다음과 같습니다.Charles Petzold의 우수한 무료 C# 도서:
//---------------------------------------------
// FirstProgram.cs (c) 2006 by Charles Petzold
//---------------------------------------------
class FirstProgram
{
public static void Main()
{
System.Console.WriteLine("Hello, Microsoft .NET Framework!");
}
}
하지만 흥미로운 점은 다음과 같습니다. Linux( uname -r
내 컴퓨터에서 4.14.188-1-MANJARO
)에서는 간단히 실행하면 ./helloworld.exe
작동합니다!
나는 몇 가지 조사를 시작했고 다음은 내가 실행한 것의 처음 몇 줄입니다 strace ./helloworld.exe
.
execve("./hw.exe", ["./hw.exe"], 0x7fffae8e6070 /* 61 vars */) = 0
[ Process PID=3381 runs in 32 bit mode. ]
brk(NULL) = 0x7eedb000
arch_prctl(0x3001 /* ARCH_??? */, 0xffb19948) = -1 EINVAL (Invalid argument)
readlink("/proc/self/exe", "/usr/bin/wine", 4096) = 13
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7faa000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/bin/../lib32/tls/i686/sse2/libwine.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/usr/bin/../lib32/tls/i686/sse2", 0xffb18e00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/bin/../lib32/tls/i686/libwine.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/usr/bin/../lib32/tls/i686", 0xffb18e00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/bin/../lib32/tls/sse2/libwine.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/usr/bin/../lib32/tls/sse2", 0xffb18e00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/bin/../lib32/tls/libwine.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/usr/bin/../lib32/tls", 0xffb18e00) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/bin/../lib32/i686/sse2/libwine.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat64("/usr/bin/../lib32/i686/sse2", 0xffb18e00) = -1 ENOENT (No such file or directory)
나는 Linux 프로그램 로더가 Windows의 PE 형식이 아닌 ELF 파일만 이해하기를 원했기 때문에 "이 파일은 유효한 실행 파일이 아닙니다"라는 오류가 발생할 것으로 예상했습니다. 대신, 시스템은 와인 검색을 시작할 만큼 충분히 똑똑한 것 같습니다(출력에서 strace
와인 라이브러리 검색을 시작하는 것을 볼 수 있으며, Linux 시스템에 이미 wine이 설치되어 있으므로 결국에는 와인을 찾습니다).
무슨 일이야? execve
PE 파일이 감지되면 와인을 시험해 볼 만큼 호출이 스마트합니까, 아니면 이것이 bash
수행되고 있습니까? 아니면 완전히 다른 것입니까?
답변1
패키지 관리자를 통해 Wine 또는 Mono를 설치해야 하며 사용자가 exe 파일을 시작한 후 수행할 작업을 커널에 알려주는 특수 구성 파일이 함께 제공됩니다.
자세한 내용을 보려면 여기를 클릭하세요:https://en.wikipedia.org/wiki/Binfmt_misc