在 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(正常大小)
- 等等。
未版本化的 *.dll 文件显然是常规文件(不是 NTFS 符号链接或连接点)。但是,它们的大小非常小(从 36 到 40 字节)和非常具体的内容。例如icudt.dll的内容是:
!<symlink>яюi_c_u_d_t_4_9_._d_l_l___
(“_”这里的意思是“\x0”,“яю”这里是“\xFF\xFE”)。
这些类似符号链接的 DLL 应该如何工作?
- Windows 可以像使用通常的 DLL 一样使用它们吗?
- 或者可能是 WinAPI 中针对此类 DLL 的一些特殊功能?
- 或者这样的 DLL 只能被 PHP 识别?
- 也许 PHP 源代码是以显式读取和分析每个 DLL 以解析此类伪符号链接的方式编写的?
注意:据说 PHP 是由 VC9 构建的,因此它可能不是与 cygwin/mingw 相关的东西(有人可能首先想到)。注意 2:在 C:\Windows 目录中没有找到这样的小型 DLL。