我有一个在 Ubuntu 16.04 上构建的可执行文件。 GUI 上和通过 ls -l 命令显示的文件大小为:
-rwxrwxr-x 1 alibivmuser alibivmuser 19108760 dic 20 15:49 NreSpeechApplication
我知道这意味着文件的实际大小是 19 MB。在我的文件系统上,大小在某种程度上相似(使用 ls -s):
18664 NreSpeechApplication
我预计 Linux 中该命令的大小输出size
会给出类似的结果,但它显示的总大小大约为 1.8 MB:
text data bss dec hex filename
1806360 2416 4552 1813328 1bab50 NreSpeechApplication
所以我的问题是:为什么两个结果如此不同?这些额外的 MB 从哪里来,从 1.8 形成 18MB?
答案1
ls
显示实际文件的大小,即打开并读取文件时的字节数。
如果您想知道该文件在磁盘上占用了多少空间,您应该使用du -h
.du
考虑文件系统的块。
示例:如果您有一个大小为 1500 的文件,而块大小为 1024,
du
则应显示 2048(因为该文件无法“适合”一个块,而ls
会显示 1500。
size
显示可执行文件的运行时映像的大小。例如,您的可执行文件将使用大约 1.8MB 的 RAM/ROM。这与文件的大小没有直接关系。
如果您想知道可执行文件将占用多少 RAM/ROM(不包括动态内存分配),则 size 可以为您提供所需的信息。
答案2
size
显示可执行文件的传统部分。
请注意,例如,这些传统部分不包含调试信息。调试信息占用大量空间。要获得完整的部分列表,请运行objdump -h NreSpeechApplication
总数(十进制/十六进制)与文件大小不直接相关还有另一个原因:它包括bss
.加载可执行文件时,此部分被初始化为零,因此它不包含在文件中。
也有可能该文件只是异常,例如在末尾添加了随机垃圾:)。