Можете ли вы запустить 32-битное приложение Cygwin в 64-битной установке? - PullRequest
0 голосов
/ 15 января 2019

Можно ли запустить 32-разрядное приложение Cygwin в 64-разрядной установке?

Мотивация: как обсуждено в Где в 64-битных окнах в cygwin 1.7.26 есть утилита rxvt-native? , rxvt-native, мой любимый эмулятор терминала в Windows, в настоящее время недоступен в 64-Cygwin. Я надеюсь, что так же, как я могу запускать 32-битные приложения Linux в 64-битных дистрибутивах Linux, возможно, я мог бы запустить 32-битную версию rxvt на 64-битной Cygwin.

Я попытался скопировать исполняемый файл из каталога C:\cygwin\bin моего старого компьютера в каталог C:\cygwin64\usr\local\bin моего нового компьютера, но он не может его запустить.

Когда я запускаю процесс, он просто молча ничего не делает.

ldd говорит мне, что некоторые зависимости отсутствуют:

$ ldd /usr/local/bin/rxvt-native.exe
        ntdll.dll => /cygdrive/c/Windows/SYSTEM32/ntdll.dll (0x7ffcb79b0000)
        ??? => ??? (0x77a10000)
        wow64.dll => /cygdrive/c/Windows/System32/wow64.dll (0x62c20000)
        wow64win.dll => /cygdrive/c/Windows/System32/wow64win.dll (0x62c80000)

Я пытался скопировать файл cygwin1.dll из моей 32-разрядной системы, но я не уверен, как сделать его доступным только для этого процесса, не скрывая 64-разрядный файл от других процессов.

Мой следующий вариант - удалить мой 64-битный Cygwin и начать заново с 32-битным вариантом, но я все еще надеюсь, что есть способ ... Спасибо за любую помощь, которую вы можете предоставить.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Как и любой дистрибутив Lnx , эмулятор Cygwin 64 позволяет запускать 32-битные исполняемые файлы (если они совместимы). Вам нужно только иметь:

  • Правильно установленные пакеты
  • Правильные .dll s в нужном месте (как вы упомянули) - но их ручное копирование (особенно в системных папках) не масштабируется и не гарантирует, что система впоследствии будет работать должным образом

Во-первых, вам понадобится пакет cygwin32 (как минимум):

Img0

Поскольку у меня нет вашего 32-битного исполняемого файла (мне не нравилось искать скачивание, распаковку и т. Д.), Я создал небольшой пример (чтобы он работал, вам также понадобятся наборы инструментов 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 ожидает, и тот, который присутствует в системе). Если это так, я бы предложил вам запустить среду Cygwin 32 , получить версию пакета cygwin ( назовем ее $ {CYGWIN_PKG_VER} ), а в среде Cygwin 64t установите версию cygwin32 , ближайшую к $ {CYGWIN_PKG_VER}

@ EDIT0

Я добавил system("echo ${PATH}"); (и неявно #include <stdlib.h>) в моей тестовой программе, а в 32-битном варианте system вернул 127 (точно так же, как exe-gcc-032.exe код выхода, если не указан правильный путь). Я подозреваю, что 2 не могут быть связаны, и что-то происходит со средой, при запуске 32-битных приложений, и, вероятно, rxvt-native пытается запустить bash (или любая другая команда) через system .

@ EDIT1

Итак, можно запускать 32-битное приложение из Cygwin 64 (краткая проверка не выявила никаких официальных источников, заявляющих, что это Неподдерживаемая конфигурация ). Но в данном конкретном случае, поскольку приложение является сложным (это терминал, необходимый для запуска нескольких других приложений), возникает проблема. Возможные пути (некоторые предложены другими людьми) пойти дальше:

  • Время отпустить (возможно, есть веская причина, по которой он не был портирован). Переход на современную замену ( Mintty )
  • Найдите неофициальную предустановленную 64 битную версию rxvt или попробуйте собрать ее самостоятельно (есть другие люди, которым это нравится)
  • На вашем ПК установлены обе среды ( Cygwin 32 и Cygwin 64 )
    • Используйте ваш любимый терминал (из Cygwin 32 ). Это будет ваша "основная" среда
    • Администрация Cygwin 64"удаленно", например с помощью:
      • ssh : я не проверял ограничения, касающиеся 2 sshd , работающих параллельно на одной машине, но если их нет Вы должны изменить порт прослушивания по умолчанию ( 22 * ​​1209 *) для одного из них. Я бы посоветовал сделать это для первого, чтобы последний был доступен снаружи, используя настройки по умолчанию
  • Продолжайте исследования в этом направлении, но, как я вижу, он начинает (если он еще не стал) стать картой замка - это больше похоже на обходной путь ( gainarie )
0 голосов
/ 16 января 2019

Нет, ты не можешь.
32-битное приложение требует 32-битного cygwin1.dll, в то время как 64-битному cygwin нужен 64-битный cygwin1.dll.

rxvt win32 native был заменен на mintty, который является терминалом cygwin по умолчанию

...