为了获取ELF二进制文件的大小,size和ls有什么区别?

3

测试运行在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二进制文件的大小,哪种方法更可靠?这两种方法有何不同之处?

2个回答

3

size(1) 告诉你文件中各个部分的大小。 ls(1) 告诉你 ELF 文件包含的字节数。它们的目的完全不同,哪一个更“可靠”完全取决于你打算做什么。


2
那你能告诉我为什么这两个尺寸不同吗? - lllllllllllll
因为该文件包含的不仅仅是部分内容。 - Ignacio Vazquez-Abrams
是的..我的意思是..除了“节”之外,“ELF”文件还包含什么? - lllllllllllll
头文件。符号表。加载、链接和/或调试ELF所需的其他所有内容。 - Ignacio Vazquez-Abrams

0
你可以将elf文件视为包含有关在运行时加载和链接程序的各种信息的文件。作为输入给出的所有信息(.text、.data、.bss、.rel.*等)都存储在elf文件的各个部分中。这些部分由某处存储在二进制文件中的节头表进行管理。
通过以下方式获取节内容的大小:
size sha512sum

但是,如果您想获取文件的总大小(其中包括节内容 - ELF 头、程序头表和节头表),那么您将使用

ls -la sha512sum

请注意,当程序被加载时(在任何地址上,即基地址),各个节的内容将被映射到离基地址不同的偏移量处。映射可能不连续,程序的运行时映像可能比文件大小要大。此外,请注意,某些节(如只包含零的.bss节)甚至没有存储在文件中。程序加载器会映射一个内存区域并在其中填充零,而不是从文件复制零。这可以节省大量磁盘空间,减小文件大小(从而缩短将二进制文件加载到内存中的时间)。

因此,程序的内存映像大小可能比文件大小要大。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接