
질문은 다소 구체적이므로 다음을 가정하십시오.
- 프로그램의 C 소스 코드는 플랫폼별 기능을 명시적으로 사용하지 않습니다(예를 들어 시스템 호출을 명시적으로 사용하지 않음).
- OS와 상호 작용하기 위해 소스 코드는 C stdlib를 사용합니다.
- stdlib는 컴파일 타임에 링크되지 않습니다.
- 프로그램은 Linux를 실행하는 컴퓨터에서 Linux용으로 컴파일된 다음 Windows를 실행하는 다른 컴퓨터로 이동되었습니다.
- Windows에서 프로그램을 실행하기 전에 Linux 실행 파일은 (어떻게든) Windows와 호환되는 형식으로 변환됩니다.
- 두 컴퓨터 모두 동일한 하드웨어를 가지고 있습니다.
- 두 시스템 모두 C stdlib를 구현합니다.
이제 질문은 다음과 같습니다.
- 위의 모든 가정을 고려할 때 프로그램이 Windows에서 실행될 수 있습니까? 그렇지 않다면 왜 그렇습니까?
- 잘못된 가정이 있다면 그 이유는 무엇입니까?
답변1
Windows와 Linux의 바이너리는 형식이 매우 다르기 때문에 서로 실행될 수 없습니다. Linux 공유 라이브러리는 Windows DLL과 전혀 동일하지 않습니다.
교차 시스템 실행은 다음 중 하나를 통해 수행됩니다.
- 대상 시스템에 대한 재컴파일(많은 컴파일러는 B에서 실행하기 위해 시스템 A에서 컴파일할 수 있음)
- 다음과 같은 에뮬레이터에서 실행 와인, 크로스오버 등
- 가상 머신, WSL(Linux용 Windows 하위 시스템), Docker 또는 이와 유사한 환경에서 실행됩니다.
답변2
아니요. Linux의 실행 파일 형식은 Windows와 호환되지 않습니다. Windows용 프로그램을 다시 컴파일해야 합니다.
또는 Linux용 Windows 하위 시스템이나 Linux를 실행하는 가상 머신에서 기본적으로 프로그램을 실행할 수 있습니다.