Linux에서 Windows .exe 파일을 실행할 수 있습니까? [복제]


답변:


13

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

11

운영 체제 (Windows 또는 Linux)는 응용 프로그램에 서비스를 제공합니다. 예를 들어, Windows 및 Linux에는 애플리케이션이 파일에 액세스하거나 네트워크에 액세스하고 화면에 항목을 표시하기 위해 호출 할 수있는 기능이 있습니다.

서로 다른 운영 체제는 서로 다른 방식으로 이러한 작업을 수행하므로 Windows 방식의 응용 프로그램은 CPU 아키텍처가 동일하더라도 Linux에서 작동하지 않으며 그 반대도 마찬가지입니다.


2
이 대답은 맞습니다. 유일한 이유는 아니지만 (다른 로더와 실행 가능한 형식도 중요합니다), 그중 하나입니다.
Matthew Flaschen

2
다른 운영 체제에서 동일한 실행 파일을 기본적으로 실행할 수없는 주된 이유 중 하나입니다.

1
@Let_Me_Be : 실제로 귀하의 의견이 정확하지 않습니다.
0xA3

1
@ 0xA3 플랫폼 별 API에 액세스하는 경우 예입니다. 그러나 대부분은 사실이 아닙니다. C 또는 C ++ 표준 라이브러리를 다시 구현하는 것은 실제로 매우 간단합니다. 버그를 다시 구현하고 호출을 리디렉션하면됩니다. 많은 작업이 필요한 것은 다른 파일 형식입니다 (플랫폼 별 API는 처음부터 다시 구현해야하기 때문에).
Šimon Tóth

2
@, 당신이해야한다고 말한 적이 없어요. "대부분"이라고 말했지만 프로그램은 플랫폼 별 API를 사용하지 않습니다. 사실, 대부분 . GTK와 같은 크로스 플랫폼 라이브러리를 사용하는 프로그램조차도 여전히 플랫폼 별 API를 간접적으로 사용하고 있습니다.
Matthew Flaschen

8

아니요, 운영 체제에 따라 다른 형식을 사용합니다 (예 : Windows는 PE를 사용하고 Linux는 ELF를 사용). 또한 컴파일 할 때 프로그램은 기본 OS 메소드를 호출합니다. 언급했듯이 WINE 을 사용할 수 있습니다 . Linux에서 Windows 바이너리를 실행하는 대부분의 기능을 제공합니다.


5

.exe 파일이 Linux에서 직접 실행되지 않는 이유와 Linux 실행 파일이 Windows에서 직접 실행되지 않는 이유는 세 가지입니다.

  1. 첫 번째는 시스템 호출입니다. 시스템 호출은 거의 정의에 따라 플랫폼마다 다릅니다. 그러나 모든 시스템 호출이 동일한 것은 아닙니다. 이식 가능한 시스템 호출 (예 : 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로 쉽게 이식 할 수있는 드라이브가 많지 않습니다.

  2. 다른 하나는 실행 파일 형식입니다. Windows는 PE (Portable Executable) 형식을 사용하고 Linux는 ELF (Executable and Linkable Format)를 사용합니다. 실행 파일 형식에는 메타 데이터가 포함되며 플랫폼에서 실행 파일을로드하고 실행하는 방법을 정의합니다.

    솔루션 : PE-> ELF 또는 ELF-> PE 변환기를 작성하는 것은 전적으로 가능합니다. 그리고 그렇게하기가 너무 어려워서는 안됩니다 (경고 : 어느 하나의 실제 형식에 익숙하지 않습니다). 다른 방법은 PE 파일을 이해할 수있는 실행 가능 로더 (예 : Wine이 하나를 제공함) 또는 ELF 파일을 이해할 수있는 실행 가능 로더를 작성하는 것입니다 (Windows의 디자인은 기본적으로 실행 파일로 두 번 클릭 가능한 파일의 실행 가능성을 제한한다고 생각합니다)

  3. 시스템 호출 규칙. 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 나는 와인이 이것을한다고 믿는다


1

룩업 와인 가능


paul @ 난 와인을 원하지 않아 ... 나는 프로그래밍에 대해 이야기하고 ... 컴파일 후 실행 파일을 얻은 후. 창과 리눅스에서 실행 파일을 실행할 수 있습니까?

1
Wikipedia 기사는 WINE이 필요한 이유에 대한 자세한 내용을 제공합니다.
Paul Whelan

1

.Net .exe 파일 인 경우에만 해당됩니다. VS에서 앱을 만들고 Windows에서 컴파일 한 다음 Linux에서 실행합니다.

mono myapp.exe

나는 이것이 정확히 당신이 찾고있는 것이 아니라는 것을 알고 있지만, 대답은 Linux 에서 일부 exe 파일을 실행할 수 있다는 것 입니다.


1

Win, Linux (또는 Mac)에서 실행 파일을 실행하는 유일한 방법은 어셈블리와 OS 지시문 사이에 일종의 "가상 계층"을 갖는 것입니다. 루카스 의 Mono에서 실행하는 옵션은 Java 빌드와 같은 방법 중 하나입니다. 파일 (또는 Adobe Air).

머신 코드가 OS 및 하드웨어에 바인드되어 있기 때문에 여러 아키텍처에서 실행되도록 실행 바이너리를 빌드하는 것은 불가능합니다. 각 시스템 / OS에 대해 여러 빌드를 수행해야 할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.