为什么.dylib 文件的物理大小比其逻辑大小小?

为什么.dylib 文件的物理大小比其逻辑大小小?

在 OSX Lion 中存在一种我无法解释的行为(在其他版本中可能也存在)。

当我复制或复制一些包含动态库的应用程序(例如 iTunes)时,这些库的物理大小会发生变化(大小会增加)。这可能是由于磁盘碎片造成的。但不仅仅是这样,因为令人惊讶的是,原始物理大小小于逻辑大小(通常物理大小总是大于逻辑大小,除非涉及压缩)。

为了说明我的情况:

antoine@amarante:/Applications$ ls -ls iTunes.app/Contents/MacOS/libgnsdk_submit.1.8.2.dylib 
384 -rwxrwxr-x+ 1 root  admin  558704  8 jul  2011 iTunes.app/Contents/MacOS/libgnsdk_submit.1.8.2.dylib

ls假设块大小为 512 字节,则 384 个块占 196608 字节,而报告的逻辑大小为 558704 字节。或者,如获取信息Finder 中的窗口:

558.704 octets (197 Ko sur disque)

在我复制整个 iTunes 应用程序后,也会出现这种情况。第一个iTunes copie是通过 Finder 完成的复制,第二个iTunes-cp是使用 CLI 命令完成的复制cp -a

antoine@amarante:/Applications$ ls -ls iTunes*.app/Contents/MacOS/libgnsdk_dsp.1.8.2.dylib 
11632 -rwxr-xr-x+ 1 antoine  admin  5955104  8 jul  2011 iTunes copie.app/Contents/MacOS/libgnsdk_dsp.1.8.2.dylib
11632 -rwxrwxr-x+ 1 antoine  admin  5955104  8 jul  2011 iTunes-cp.app/Contents/MacOS/libgnsdk_dsp.1.8.2.dylib
 3944 -rwxrwxr-x+ 2 root     admin  5955104  8 jul  2011 iTunes.app/Contents/MacOS/libgnsdk_dsp.1.8.2.dylib

我们看到,复制的文件的物理大小(11632*512 = 5955584 字节)大于逻辑大小(5955104),但原始文件除外,原始文件小得多。当我.dylib单独复制单个文件时,行为是相同的。这种情况发生在一些动态库文件中,但不是全部。

原始库文件怎么会比副本小?是否涉及压缩?或者我的原始文件是否以某种方式损坏?我该如何检查?

答案1

事实上,Mac 10.6 及更高版本的 HFS+ 中存在压缩。它是透明的,甚至很难用标准操作系统工具检测到。

而且,这并不总是会这样做。为了向后兼容,默认是不压缩的,但它们会在安装操作系统时对其进行压缩。

工具列表(以防链接断裂):

  • hfsdebug
  • afsctool
  • stat -f %f- 报告文件上的“用户标志” - 其中一个标志表示压缩。我在压缩文件上得到“32”,在未压缩文件上得到“0”。可能 32 映射到位字段。
  • ditto - 支持写入压缩文件

相关内容