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 は見つかりませんでした。