3

在 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。

4

1 回答 1

1

Windows 不会将这些文件识别为 DLL 或任何类型的 DLL 链接。正如 Hans Passant 正确建议的那样,它是 Cygwin 特定的文件,只有基于 Cygwin 的构建才会将它们识别为 Cygwin 框架的符号链接,而不是 Windows 操作系统。

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

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

于 2012-12-23T16:05:32.420 回答