什么是PHP的Windows发行版中的36字节长的* .dll文件? 符号链接? 怎么样?

在linux / unix世界中,符号链接* .so文件被广泛使用。 即通常看到libfoo.so和libfoo.so.X文件只是符号链接到libfoo.so.XYZ(这是常规文件)。 我从来没有这样的东西在Windows上(虽然Windows 不 支持符号链接)。

总之,当我最近下载Windows的PHP二进制发行版时,我看到了非常相似的图片:

  • icudt.dll(大小只有36个字节)
  • icudt46.dll(正常大小)
  • icudt49.dll(正常大小)
  • icuuc.dll(大小只有36个字节)
  • icuuc46.dll(正常大小)
  • icuuc49.dll(正常大小)
  • 等等。

Unversioned * .dll文件显然是常规文件(不是NTFS符号链接或联结点)。 但是,它们的体积非常小(从36到40字节),而且非常具体。 例如,icudt.dll的内容是:

!<symlink>яюi_c_u_d_t_4_9_._d_l_l___ 

(“_”在这里的意思是“\ x0”,“яю”在这里是“\ xFF \ xFE”)。

这些符号链接的DLL应该如何工作?

  • Windows能像平常一样使用DLL吗?
  • 或者也许在这样的DLL的WinAPI中的一些特殊function?
  • 或者这样的DLL只被PHP识别?
    • 也许PHP源代码是这样写的:它明确地读取和分析每个DLL来解决这种伪符号链接?

注意:PHP是由VC9构build的,因此它可能不是cygwin / mingw相关的东西(正如有人可能首先想到的那样)。 注2:在C:\ Windows目录中找不到这样的小型DLL。

Windows不会将这些文件识别为DLL或DLL的任何类型的链接。 Hans Passant正确地提出这是Cygwin特定的文件,只有基于Cygwin的版本会将它们识别为Cygwin框架的符号链接,而不是Windows操作系统。

如果你尝试在任何标准的Win32 API中使用它们,你会得到一堆声称可执行文件格式无效的加载错误。 事实上,PHP是由VC9编译的,并不意味着VC9创建了这些文件,因为它们很可能是通过一些Cygwin工具准备的。

PS Windows中最小的可执行文件大小为97个字节,如此处所述。