.exeLinux 에서 Windows 파일을 실행할 수 있습니까 ?
동일한 아키텍처를 사용하면 가능합니까? 두 프로그램 모두 X86 아키텍처에서 실행되는 것처럼 .exeLinux 에서 Windows를 실행할 수 있습니까?
.exeLinux 에서 Windows 파일을 실행할 수 있습니까 ?
동일한 아키텍처를 사용하면 가능합니까? 두 프로그램 모두 X86 아키텍처에서 실행되는 것처럼 .exeLinux 에서 Windows를 실행할 수 있습니까?
답변:
exe 파일은 Linux 또는 Windows에서 실행되지만 둘 다에서 실행되지는 않습니다.
Windows에서 실행
파일이 Windows 파일 인 경우 Linux에서 자체적으로 실행되지 않습니다. 이 경우 Windows 호환성 계층 (와인)에서 실행 해 볼 수 있습니다. 와인과 호환되지 않으면 Linux에서 와인을 실행할 수 없습니다.
시작하기 전에 와인을 설치해야합니다. Wine 설치 단계는 Linux 플랫폼에 따라 다릅니다. 예를 들어 Ubuntu를 설치하는 경우 Google "Ubuntu install wine"을 사용할 수 있습니다.
와인을 설치 한 후에는이 명령을 실행할 수 있습니다.
wine xxx.exe
리눅스에서 실행
이 파일이 리눅스에서 실행되는 것을 알고 있다면 다음 명령을 실행하고 싶을 것입니다.
당신은 전자에 대한 모든 사용자 수 있도록 권한을 변경할 수 있습니다 X ecute이 파일을 (A + X). 또한 사용자에게 e x ecute (u + x) 를 허용 할 수도 있습니다.
chmod a+x xxx.exe
프로그램을 시작하면 ./명령 행에서 파일을 실행할 현재 경로를 찾도록 지시합니다 ( 'current'디렉토리가 $ PATH 환경 변수에없는 경우).
./xxx.exe
운영 체제 (Windows 또는 Linux)는 응용 프로그램에 서비스를 제공합니다. 예를 들어, Windows 및 Linux에는 애플리케이션이 파일에 액세스하거나 네트워크에 액세스하고 화면에 항목을 표시하기 위해 호출 할 수있는 기능이 있습니다.
서로 다른 운영 체제는 서로 다른 방식으로 이러한 작업을 수행하므로 Windows 방식의 응용 프로그램은 CPU 아키텍처가 동일하더라도 Linux에서 작동하지 않으며 그 반대도 마찬가지입니다.
.exe 파일이 Linux에서 직접 실행되지 않는 이유와 Linux 실행 파일이 Windows에서 직접 실행되지 않는 이유는 세 가지입니다.
첫 번째는 시스템 호출입니다. 시스템 호출은 거의 정의에 따라 플랫폼마다 다릅니다. 그러나 모든 시스템 호출이 동일한 것은 아닙니다. 이식 가능한 시스템 호출 (예 : C / C ++ 표준 라이브러리에 의해 정의 됨) 및 이식 불가능한 시스템 호출 (예 : POSIX 또는 Microsoft에 의해 정의 됨)이 있습니다. 컴파일 타임에 시스템 라이브러리와 정적으로 링크 된 응용 프로그램은 정적으로 포함 된 코드 부분이 플랫폼의 디자인이 크게 다르기 때문에 대상 플랫폼에서 올바르게 실행될 가능성이 없다는 것을 알 수 있습니다. 런타임시 동적으로 링크 된 응용 프로그램은 몇 가지 조건으로 실행될 수 있습니다. 이식 가능한 시스템 호출 인 경우 원래 바이너리 시스템 호출과 대상 플랫폼의 시스템 호출간에 변환 표가 있습니다. 이식성이없는 시스템 호출 인 경우도 1에 도시 된 바와 같이 , 상이한 플랫폼은 상이한 세트의 특징을 가지며, 일부 특징은 다른 플랫폼에서 의미가 없다 2 ).
솔루션 : Linux에서 Windows 프로그램을 실행하기 위해 Wine은 Windows 시스템 호출 및 Windows 시스템 라이브러리의 구현을 제공하며 PE 형식도 인식합니다. Wine은 재 컴파일하지 않고 Linux에서 Windows 프로그램을 실행할 수 있습니다. Windows의 Linux 프로그램의 경우 Cygwin은 Windows에서 POSIX 시스템 호출의 구현을 제공하며, Cygwin GCC를 사용하여 Linux 용으로 작성된 프로그램을 소스 코드 변경없이 Windows 시스템에서 실행하도록 재 컴파일 할 수 있습니다. 대부분의 Linux 프로그램의 오픈 소스 특성으로 인해 Wine의 바이너리 호환 레이어 제공 방식을 사용하는 것보다 재 컴파일하는 것이 더 쉽습니다. 와인과 같은 호환성 레이어를 제공하는 것은 불가능하지 않지만 Cygwin의 방식은 더욱 강력하며 오픈 소스가 아닌 Linux 프로그램을 Windows로 쉽게 이식 할 수있는 드라이브가 많지 않습니다.
다른 하나는 실행 파일 형식입니다. Windows는 PE (Portable Executable) 형식을 사용하고 Linux는 ELF (Executable and Linkable Format)를 사용합니다. 실행 파일 형식에는 메타 데이터가 포함되며 플랫폼에서 실행 파일을로드하고 실행하는 방법을 정의합니다.
솔루션 : PE-> ELF 또는 ELF-> PE 변환기를 작성하는 것은 전적으로 가능합니다. 그리고 그렇게하기가 너무 어려워서는 안됩니다 (경고 : 어느 하나의 실제 형식에 익숙하지 않습니다). 다른 방법은 PE 파일을 이해할 수있는 실행 가능 로더 (예 : Wine이 하나를 제공함) 또는 ELF 파일을 이해할 수있는 실행 가능 로더를 작성하는 것입니다 (Windows의 디자인은 기본적으로 실행 파일로 두 번 클릭 가능한 파일의 실행 가능성을 제한한다고 생각합니다)
시스템 호출 규칙. Linux와 Windows는 사용 가능한 시스템 호출 집합이 다르고 시스템 호출 호출 규칙도 매우 다릅니다. Linux에서 시스템 호출을 수행하려면 eax / rax 레지스터의 syscall 번호와 나머지 레지스터의 인수를 전달한 다음 0x80 인터럽트 요청을합니다. DOS에서는 레지스터에 인수를 전달하지만 각 시스템 서비스마다 다른 인터럽트 요청 번호가 있으므로 시스템 호출 번호를 eax / rax로 전달하지 않습니다. Windows NT는 Linux와 비슷하지만 0x80 대신 0x2E 인터럽트 요청을 발생 시키지만 시스템 호출 번호는 여전히 다릅니다 (따라서 시스템 호출 번호 변환 테이블 및 가능하면 호환성 계층이 필요함).
솔루션 : 자체 수정 코드가 없거나 데이터를 코드로 실행하거나 다른 까다로운 코드를 수행하려고 할 때도 실행 파일을 분석하고 모든 시스템을 검색하는 것은 여전히 매우 어렵습니다 (정지 문제를 해결하기가 어렵습니다) 호출은 요청을 중단하고 대상 플랫폼의 시스템 호출로 변환합니다. 보다 쉬운 방법은 프로그램의 인터럽트 요청을 처리하고이를 대상 플랫폼의 시스템 호출로 리디렉션하는 런타임 서비스를 제공하는 것입니다 3 .
다른 여러 가지 이유가 있지만이 세 가지가 큰 걸림돌이라고 생각합니다.
1 파일 시스템 보안을 염두에두고 Linux 보안 비트와 Windows NTFS ACL간에 변환 할 방법이 없습니다.
2 Windows는 프로세스를 분기 할 수 없습니다. CreateProcess는 포크를 에뮬레이트하는 데 다소 사용될 수 있지만 쓰기시 복사 시맨틱을 잃습니다. Windows에서는 기록 중 복사 작성 프로세스를 수행 할 방법이 없습니다.
3 나는 와인이 이것을한다고 믿는다