============== Cygwin 버전

============== 
Cygwin 버전

foo.exe대화형 입력이 필요한 오래된 Fortran 실행 파일이 있습니다 .

foo.exeCywin에서 전화를 걸면 대화형 입력을 요청하는 메시지가 표시되고 프로그램이 제대로 실행됩니다 .

WSL에서 호출 하면 foo.exe대화형 입력을 요청하는 메시지가 표시되고 프로그램이 제대로 실행됩니다.


foo.exe대화형으로 모든 내용을 입력하는 과정을 거칠 필요가 없도록 스크립트를 실행하거나 입력을 보내고 싶습니다 .

Cygwin에서는 다음을 수행합니다.

foo.exe << EOI
1
1
Test
Out
EOI

다 괜찮아!

WSL에서 동일한 작업을 수행하려고 시도했지만 다음 오류 메시지가 표시되었습니다.

forrtl: An attempt was made to move the file pointer before the beginning of the file.
forrtl: severe (39): error during read, unit -4, file CONIN$
Image              PC        Routine            Line        Source
libifcorert.dll    1003A159  Unknown               Unknown  Unknown


그래서 원본 파일을 가져와서 foo.f다음을 사용하여 다시 컴파일하려고 했습니다.gfortran

gfortran foo.f -o new_foo.exe

그런 다음 Cygwin에서 대화형 호출을 시도했고 new_foo.exe다음을 얻었습니다.

bash: ./newfoo.exe: cannot execute binary file: Exec format error

따라서 Cygwin에서 작동하던 기능이 더 이상 작동하지 않습니다.

그런 다음 WSL에서 대화형 호출을 시도했는데 new_foo.exe제대로 작동했습니다.

이제 WSL을 사용하여 스크립트를 실행하거나 new_foo.exe입력을 보낼 수 있으며 제대로 작동하지만(이전에는 이 작업을 수행할 수 없었습니다) Cygwin에서는 이 작업을 수행할 수 있는 기능을 잃었습니다. 한 걸음 전진, 두 걸음 후퇴? ?


그런 다음 32비트를 사용하여 다시 컴파일해야 한다고 생각했습니다.

gfortran -m32 foo.f -o new_foo_32.exe

이 32비트 컴파일 프로그램은 Cygwin 또는 WSL에서 작동하지 않으며 다음 오류가 발생합니다.

bash: ./newfoo.exe: cannot execute binary file: Exec format error

최종 목표는 Cygwin 및 WSL에서 대화형으로 실행할 수 있는 단일 foo.exe 프로그램을 갖는 것입니다(원래 코드에서 수행함).그리고Cygwin과 WSL 모두에서 입력을 파이프/전송할 수 있습니다. 원래 코드에서는 Cygwin에서만 이 작업을 수행할 수 있었습니다.

어떤 제안이 있으십니까?

==============
Cygwin 버전

CYGWIN_NT-10.0-WOW 
<computer> 2.4.1(0.293/5/3) 
2016-01-24 11:24 i686 Cygwin

==============
WSL 버전

Linux <computer> 4.4.0-18362-Microsoft 
#476-Microsoft Fri Nov 01 16:53:00 PST 2019 
x86_64 x86_64 x86_64 GNU/Linux

Distributor ID: Ubuntu
Description:    Ubuntu 20.04.2 LTS
Release:        20.04
Codename:       focal

답변1

.exeCygwin에서 생성된 파일에는 Cygwin에 대한 종속성이 있다고 생각합니다 . 그렇죠? 적어도 표준 입력 파이프 처리에 관한 한 분명히 그렇습니다.

PowerShell에서 이 작업을 수행하면 어떻게 되는지 궁금합니다.

@"
1
1
Test
Out
"@ | foo.exe

WSL에서 볼 수 있는 것과 동일한 오류가 발생하기를 바랍니다(적어도 올바른 방향으로 갈 수 있도록).

(WSL에서) 어떻습니까?

/mnt/C/cygwin/bin/bash.exe -c "foo.exe" << EOI
1
1
Test
Out
EOI

반대로 WSL에서는 컴파일러가 Linux ELF 바이너리를 생성해야 하지만 .exeCygwin에서는 이를 Windows로 부팅하려고 시도할 수도 있지만 .exe그렇지 않습니다.

관련 정보