3

Linux/Unix の世界では、symlink *.so ファイルが広く使用されています。つまり、libfoo.so.XYZ (通常のファイル) への単なるシンボリックリンクである libfoo.so および libfoo.so.X ファイルをよく見かけます。Windows ではそのようなことは決してしません (Windows シンボリックリンクをサポートしていますが)。

とはいえ、最近 Windows 用の PHP バイナリ ディストリビューションをダウンロードしたとき、非常によく似た画像が表示されました。

  • icudt.dll (サイズはわずか 36 バイト)
  • icudt46.dll (通常サイズ)
  • icudt49.dll (通常サイズ)
  • icuuc.dll (サイズはわずか 36 バイト)
  • icuuc46.dll (通常サイズ)
  • icuuc49.dll (通常サイズ)
  • 等々。

バージョン管理されていない *.dll ファイルは明らかに通常のファイルです (NTFS シンボリック リンクやジャンクション ポイントではありません)。ただし、サイズが非常に小さく (36 から 40 バイト)、非常に特殊な内容になっています。たとえば、icudt.dll の内容は次のとおりです。

!<symlink>яюi_c_u_d_t_4_9_._d_l_l___

("_" は "\x0" を意味し、"яю" は "\xFF\xFE" を意味します)。

これらのシンボリックリンクのような DLL はどのように動作するはずですか?

  • ウィンドウは通常の DLL と同じように動作しますか?
  • それとも、そのような DLL 用の WinAPI の特別な関数でしょうか?
  • それとも、そのような DLL は PHP によってのみ認識されますか?
    • PHP ソースは、すべての DLL を明示的に読み取って分析し、そのような疑似シンボリック リンクを解決するように記述されているのではないでしょうか?

注: PHP は VC9 によってビルドされたと言われているため、おそらく cygwin/mingw 関連のものではありません (誰かが最初に考えるかもしれません)。注 2: C:\Windows ディレクトリには、そのような小さなサイズの DLL は見つかりませんでした。

4

1 に答える 1

1

Windowsは、これらのファイルをDLLまたはDLLへのリンクとして認識しません。Hans Passantが正しく提案したように、それはCygwin固有のファイルであり、CygwinベースのビルドのみがWindowsOSではなくCygwinフレームワークによってそれらをシンボリックリンクとして認識します。

これらを標準のWin32APIのいずれかで使用しようとすると、実行可能ファイルの形式が無効であると主張するロードエラーが多数発生します。PHPがVC9によってコンパイルされたという単なる事実は、VC9が問題のファイルを作成したことを意味するわけではありません。ファイルはCygwinツールを使用して作成された可能性が高いからです。

PSここで説明するように、Windowsで可能な最小の実行可能ファイルサイズは97バイトです。

于 2012-12-23T16:05:32.420 に答える