Как и любой другой дистрибутив Lnx, эмулятор Cygwin 64 позволяет запускать 32-битные исполняемые файлы (если они совместимы). Вам нужно всего лишь иметь:
- Установлены правильные пакеты
- Правильные .dll в нужном месте (как вы упомянули), но их ручное копирование (особенно в системные местоположения) не масштабируется и не гарантирует, что система будет работать должным образом впоследствии.
Во-первых, вам понадобится установленный пакет cygwin32 (как минимум):
Поскольку у меня нет вашего 32-битного исполняемого файла (мне не нравилось искать загрузку, распаковку и так далее ...), я создал небольшой пример (чтобы он запустился, вы ' d также нужны инструменты gcc - которые у меня есть для других целей, но в любом случае это не связано с вопросом), который воспроизводит поведение.
code.c:
#include <stdio.h>
int main() {
printf("\"void*\" is %d bits long.\n", sizeof(void*) * 8);
return 0;
}
Вывод:
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> uname -a
CYGWIN_NT-10.0 cfati-5510-0 2.11.2(0.329/5/3) 2018-11-08 14:34 x86_64 Cygwin
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> ls
code.c
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> x86_64-pc-cygwin-gcc.exe -o exe-gcc-064.exe code.c
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> i686-pc-cygwin-gcc.exe -o exe-gcc-032.exe code.c -m32
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> ls -al
total 433
drwxrwx---+ 1 Administrators None 0 Jan 16 12:45 .
drwxrwx---+ 1 Administrators None 0 Jan 16 10:33 ..
-rwxrwx---+ 1 Administrators None 118 Jan 16 10:39 code.c
-rwxrwxr-x+ 1 cfati None 151062 Jan 16 12:45 exe-gcc-032.exe
-rwxrwxr-x+ 1 cfati None 157755 Jan 16 12:45 exe-gcc-064.exe
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]>
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> file exe-gcc-064.exe
exe-gcc-064.exe: PE32+ executable (console) x86-64, for MS Windows
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> ldd exe-gcc-064.exe
ntdll.dll => /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffcaf990000)
KERNEL32.DLL => /cygdrive/c/WINDOWS/System32/KERNEL32.DLL (0x7ffcaf300000)
KERNELBASE.dll => /cygdrive/c/WINDOWS/System32/KERNELBASE.dll (0x7ffcabe60000)
cygwin1.dll => /usr/bin/cygwin1.dll (0x180040000)
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> ./exe-gcc-064.exe
"void*" is 64 bits long.
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]>
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> file exe-gcc-032.exe
exe-gcc-032.exe: PE32 executable (console) Intel 80386, for MS Windows
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> ldd exe-gcc-032.exe
ntdll.dll => /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffcaf990000)
??? => ??? (0x77150000)
wow64.dll => /cygdrive/c/WINDOWS/System32/wow64.dll (0x7ffcaf800000)
wow64win.dll => /cygdrive/c/WINDOWS/System32/wow64win.dll (0x7ffcad570000)
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> ./exe-gcc-032.exe
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]>
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> echo $?
127
Как видите, я столкнулся с той же проблемой для exe-gcc-032.exe. Зависимость ??? - это 32-разрядная cygwin1.dll. Давайте исследуем проблему:
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> find /usr -name cygwin1.dll
/usr/i686-pc-cygwin/sys-root/usr/bin/cygwin1.dll
/usr/bin/cygwin1.dll
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> cygcheck -f /usr/bin/cygwin1.dll
cygwin-2.11.2-1
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> file /usr/bin/cygwin1.dll
/usr/bin/cygwin1.dll: PE32+ executable (DLL) (console) x86-64, for MS Windows
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]>
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> cygcheck -f /usr/i686-pc-cygwin/sys-root/usr/bin/cygwin1.dll
cygwin32-2.10.0-1
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> file /usr/i686-pc-cygwin/sys-root/usr/bin/cygwin1.dll
/usr/i686-pc-cygwin/sys-root/usr/bin/cygwin1.dll: PE32 executable (DLL) (console) Intel 80386 (stripped to external PDB), for MS Windows
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]>
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> echo ${PATH}
/usr/local/bin:/usr/bin:/cygdrive/c/Program Files (x86)/Common Files/Oracle/Java/javapath:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/WINDOWS/System32/WindowsPowerShell/v1.0:/cygdrive/c/Install/x64/NVidia/GPU Computing Toolkit/CUDA/AllVers/bin:/cygdrive/c/Install/x64/NVidia/GPU Computing Toolkit/CUDA/AllVers/libnvvp:/cygdrive/c/Install/x86/Borland/Delphi/7/Bin:/cygdrive/c/Install/x86/Borland/Delphi/7/Projects/Bpl:/cygdrive/c/ProgramData/Oracle/Java/javapath:/cygdrive/c/Program Files (x86)/Intel/iCLS Client:/cygdrive/c/Program Files/Intel/iCLS Client:/cygdrive/c/Program Files (x86)/Intel/Intel(R) Management Engine Components/DAL:/cygdrive/c/Program Files/Intel/Intel(R) Management Engine Components/DAL:/cygdrive/c/Program Files (x86)/Intel/Intel(R) Management Engine Components/IPT:/cygdrive/c/Program Files/Intel/Intel(R) Management Engine Components/IPT:/cygdrive/c/Program Files (x86)/NVIDIA Corporation/PhysX/Common:/cygdrive/c/WINDOWS/System32/OpenSSH:/cygdrive/c/Install/x86/IVI Foundation/VISA/AllVers/WinNT/Bin:/cygdrive/c/Program Files/IVI Foundation/VISA/Win64/Bin:/cygdrive/c/Install/x86/IVI Foundation/VISA/AllVers/WinNT/Bin:/cygdrive/e/Work/Dev/Utils/cfati-5510-0/windows:/cygdrive/c/Install/x64/NVidia/GPU Computing Toolkit/cuDNN/AllVers/bin:/cygdrive/c/Users/cfati/AppData/Local/Microsoft/WindowsApps:/cygdrive/c/Install/Qt/Qt/5.9.1/msvc2015/bin
Итак, 32-разрядная .dll существует (установлена указанным выше пакетом), но ее нельзя найти, так как ее каталог не находится в $ {PATH } (из-за длины содержимого это не видно сразу). Обратите внимание, что Cygwin не учитывает $ {LD_LIBRARY_PATH} в этом сценарии.
Очевидный шаг - сообщить системе об этой .dll, добавив ее каталог в $ {PATH} (в начале):
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> export PATH=/usr/i686-pc-cygwin/sys-root/usr/bin:${PATH}
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> ./exe-gcc-032.exe
"void*" is 32 bits long.
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> ./exe-gcc-064.exe
"void*" is 64 bits long.
Вот и все.
Заключительные примечания:
- (64-разрядная) ldd, который является .exe (в отличие от Nix, где это скрипт), не не корректно обрабатывают зависимости для 32-битных артефактов. К сожалению, пакет cygwin32-binutils не предоставляет 32-битного аналога, в котором не было бы этой проблемы, поэтому на данный момент это настолько хорошо, насколько возможно.
- Вы можете столкнуться с некоторыми проблемами при запуске вашего .exe из-за возможных различий между версиями cygwin1.dll (той, которая rxvt-native.exe em > ожидает и тот присутствует в системе). Если это так, я бы посоветовал вам запустить среду Cygwin 32 и получить версию пакета cygwin (назовем ее $ {CYGWIN_PKG_VER} em>), а в среде Cygwin 64t установите версию cygwin32, которая ближе всего к $ {CYGWIN_PKG_VER}
@ EDIT0:
Я добавил system("echo ${PATH}");
(и неявно #include <stdlib.h>
) в свою тестовую программу, а в 32-битном варианте system вернул 127 strong > (точно так же, как код выхода exe-gcc-032.exe, если не указан правильный путь). Я подозреваю, что эти 2 не могут быть связаны друг с другом, и что-то происходит со средой при запуске 32-битных приложений, и, вероятно, rxvt-native пытается запустить bash < / em> (или любую другую команду) через system.
@ EDIT1:
Итак, возможно запускать 32-битное приложение из Cygwin 64 (краткая проверка, не обнаружила никаких официальных источников, заявляющих, что это Неподдерживаемая конфигурация). Но в этом конкретном случае, поскольку приложение является сложным (это терминал, необходимый для запуска нескольких других приложений), возникает проблема. Возможные пути (некоторые из них предложены другими людьми) для дальнейшего развития:
- Пора отпускать (наверное, есть веская причина, по которой его не перенесли). Переключитесь на современную замену (Mintty)
- Найдите неофициальную предварительно собранную 64-битную версию rxvt или попробуйте собрать ее самостоятельно (есть некоторые другие люди, которым она нравится)
- Have both environments (Cygwin 32 and Cygwin 64) installed on your PC
- Use your favorite terminal (from Cygwin 32). This will be your "main" environment
- Administrate Cygwin 64 "remotely", e.g. via:
- ssh: I didn't check for restrictions regarding the 2 sshds running in parallel on the same machine, but if there aren't any, you should change the listening port from default (22) for one of them. I'd suggest to do that for the former, so that the latter is available from "outside" using default settings
- Продолжайте исследования в этом направлении, но, насколько я понимаю, он начинает (если еще не стал) превращаться в карту замка - это больше похоже на обходной путь (gainarie)
person
CristiFati
schedule
16.01.2019