测试在32位x86 Linux上进行。
为了获得一些ELF二进制文件的大小,我尝试了这两个命令:
ls -la sha512sum
size sha512sum
但问题是尺寸输出是不同的:
ls -la sha512sum
-rwxrwxr-x 1 szw175 szw175 95856 Oct 10 07:50 sha512sum
size sha512sum
text data bss dec hex filename
89644 488 452 90584 161d8 sha512sum
所以我的问题是,为了评估ELF二进制文件的大小,哪种方法更可靠?为什么这两种方法不同?
答案 0 :(得分:2)
size(1)
告诉您文件中各个部分的大小。 ls(1)
告诉您ELF文件包含的字节数。它们服务于完全不同的目的,哪一个更“可靠”完全取决于你将如何处理文件。
答案 1 :(得分:0)
你可以想到一个精灵文件包含有关加载和放大的各种信息。在运行时链接程序。作为输入(.text,.data,.bss,.rel。*等)提供的所有信息都存储在elf文件的各个部分中。这些部分由存储在二进制文件中的section-header表管理。
您可以通过
获得部分内容的大小size sha512sum
但是,如果你想获得文件的总大小(包括部分内容 - elf-header,program-header table和section-header table),那么你将使用
ls -la sha512sum
注意,当加载程序时(在任何地址,即基地址),段的内容将映射到基址的各种偏移量。映射可能不是连续的,并且程序的运行时映像可能大于文件大小。另请注意,某些部分(如仅包含零的.bss)甚至不存储在文件中。程序加载器映射内存区域并在其中填充零,而不是从文件中复制零。这节省了大量的磁盘空间和减少文件大小(因此,将二进制文件加载到内存中的时间)。
因此,程序的内存映像大小可能大于文件大小。