64ビットインストールで32ビットCygwinアプリケーションを実行することは可能ですか?
動機:64ビットウィンドウのcygwin 1.7.26でrxvtネイティブユーティリティはどこに行きましたか?で説明したように?、rxvt-native
、Windowsで私の好きな端末エミュレータは、現在、64のCygwinでは使用できません。私の望みは、64ビットLinuxディストリビューションで32ビットLinuxアプリケーションを実行できるのと同じように、64ビットCygwinで32ビットrxvtを実行できることです。
古いPCのC:\cygwin\bin
ディレクトリから新しいPCの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ビットのバリアントからやり直すことですが、それでも方法があることを望んでいます...ご協力いただきありがとうございます。
他のLnxディストリビューションと同様に、Cygwin 64エミュレーターでは、32ビットの実行可能ファイルを実行できます(互換性がある場合)。次のいずれかが必要です。
まず、cygwin32パッケージを(少なくとも)インストールする必要があります。
私はあなたの持っていないので、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}を尊重しないことに注意してください。
明らかな手順は、$ {PATH}(先頭)にディレクトリを追加して、この.dllについてシステムに通知することです。
[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.
そこに行きます。
最後の注意:
@ EDIT0:
テストプログラムにsystem("echo ${PATH}");
(そして暗黙的に#include <stdlib.h>
)追加しましたが、32ビットバリアントでは、システムは127を返しました(適切なパスがない場合のexe-gcc-032.exeの終了コードと同様)。32ビットアプリケーションを起動すると、2は無関係ではなく、環境に何かが発生し、おそらくrxvt-nativeはシステムを介してbash(またはその他のコマンド)を起動しようとします。
@ EDIT1:
したがって、Cygwin 64から32ビットアプリケーションを実行することは可能です(簡単なチェックでは、サポートされていない構成であることを示す公式のソースは明らかにされませんでした)。ただし、この特定のケースでは、アプリが複雑であるため(端末であり、他の複数のアプリケーションを実行する必要があります)、問題があります。さらに進むための可能な方法(他の人によって提案されたものもあります):
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加