代码之家  ›  专栏  ›  技术社区  ›  joanis Ankur Kumar Srivastava

可以在64位安装中运行32位Cygwin应用程序吗?

  •  1
  • joanis Ankur Kumar Srivastava  · 技术社区  · 7 年前

    是否可以在64位安装中运行32位cygwin应用程序?

    动机:如中所述 Where's the rxvt-native utility gone in cygwin 1.7.26 for 64bit windows? , rxvt-native 是我在Windows中最喜欢的终端模拟器,目前在64 cygwin中不可用。我希望就像我可以在64位Linux发行版上运行32位Linux应用程序一样,也许我可以在64位Cygwin上运行32位RXVT。

    我已尝试从旧PC复制可执行文件 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 回复  |  直到 7 年前
        1
  •  0
  •   CristiFati    7 年前

    像任何 LNX 分配,即 CygWin 64 Emulator允许运行 32位 可执行文件(只要它们兼容)。您只需要:

    • 安装了正确的软件包
    • 右边 动态链接库 S在正确的位置(如您所提到的)-但是手动复制它们(尤其是在系统位置)既不可扩展,也不能保证系统在之后能够正常工作

    首先,你需要 CygWi32 安装的程序包(至少):

    Img0

    因为我没有你的 32位 可执行文件(我不像搜索、下载、解包等…)我创建了一个小示例(要使其运行,您需要 海湾合作委员会 工具链——我有其他用途,但无论如何,这与问题无关),它复制了行为。

    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
    

    正如你所看到的,我也遇到了同样的问题 EXC-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位 动态链接库 存在(由上述包安装),但找不到,因为其目录不在 ${PAT} (由于内容长度的原因,这不会立即可见)。注意 赛文 不荣誉 $ld_library_path_ 在这种情况下。

    最明显的步骤是让系统知道这一点 动态链接库 ,通过将其dir添加到 ${PAT} ( 开始的时候 ):

    [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位 ) 低密度脂蛋白 这是一个 exe (不像) 尼克斯 如果它是脚本),则无法优雅地处理 32位 人工制品。不幸的是, Cygwin32-Binutils 程序包不提供 32位 不会有这个问题的对应物,所以目前这是最好的。
    • 在运行您的 exe ,因为 CygWiN1.DLL 版本(即 RXVT-NATEVE.EXE 期望值,以及系统上存在的值)。如果是这样,我建议你开始 CygWin 32 环境,获取 赛文 程序包版本( 让我们称之为 $cygwin_pkg_ver_ ) CygWin 64 T 环境,安装 CygWi32 最接近的版本 $cygwin_pkg_ver_

    @编辑0 :

    我补充说 system("echo ${PATH}"); (隐含地) #include <stdlib.h> )在我的测试程序中, 32位 变体, 系统 返回 一百二十七 (就像 EXC-GCC-032.EXE 没有正确路径时的退出代码)。我怀疑2号不能是无关的,当发射时,环境发生了变化。 32位 应用程序,可能 RXVT本机 尝试发射 猛击 (或任何其他命令)通过 系统 .

    @ Eddi1 :

    所以, 可以运行 32位 应用程序来自 CygWin 64 (一个简短的检查,没有透露任何官方消息说这是一个 不支持的配置 )。但在这个特定的例子中,由于应用程序很复杂(它是一个终端,需要运行多个其他应用程序),所以存在一个问题。进一步发展的可能方法(有些人建议):

    • 是时候放手了(可能有一个很好的理由没有预告)。换成现代的( 薄荷 )
    • 搜索非官方预制构件 64位 版本 终端窗口 或者试着自己做(有些人喜欢)
    • 有两种环境( CygWin 32 CygWin 64 )安装在您的 个人计算机
      • 使用您最喜欢的终端(从 CygWin 32 )这将是你的“主要”环境
      • 管理 CygWin 64 “远程”,例如通过:
        • :我没有检查关于2的限制 SSHD 在同一台计算机上并行运行,但如果没有,则应将侦听端口从默认值更改为( 二十二 )其中一个。我建议为前者这样做,以便后者可以从“外部”使用默认设置
    • 继续研究这个方向,但正如我看到的,它开始(如果还没有)成为一张城堡卡-这看起来更像是一个解决方法( 盖纳里 )
        2
  •  1
  •   matzeri    7 年前

    不,你不能。
    32位应用程序需要32位cygwin1.dll,而 64位cygwin需要64位cygwin1.dll。

    rxvt win32 native被mintty(默认的cygwin终端)替换。