在编译项目时,我注意到 du 和 size 命令输出不相加:
> du -sh X.o
490K X.o
> size X.o
text data bss dec hex filename
2128 0 12 2140 85c X.o
为什么目标文件占用的磁盘空间与文件的文本数据和bss段之和不同?我在这里想念什么?
该size
命令向您显示在执行期间代码和数据将占用多少。当然,目标文件包含的内容远不止这些。
它从文件格式本身的开销开始,它必须至少包含size
用于找出每个部分在内存中的大小的信息。然后是符号表、调试信息和谁知道什么(取决于编译器和目标文件格式)。
您可以获得更全面的信息objdump -h
(或objdump -x
查看有多少重定位记录),这些信息仍然不能涵盖开销,但会显示有多少实际内容。
du
显示驻留在文件系统 Vs 上的文件的大小。size
这是实际大小(以字节为单位)。
大小巨大的原因du
- 文件系统通常由文件不适合这些块的块组成,这正是导致这种差异的原因。例如,如果文件大小为 4096 字节,则size
显示 4096 类似于du
但当文件大小为 5000 字节时,size
显示 5000 字节但du
显示 8192。
这称为松弛空间。
注意:以上假设文件系统分配以 4096 字节为单位。