安装教程参考:https://github.com/google/bloaty
Bloaty是一个用于分析二进制文件大小的工具,它可以深入分析二进制文件,使用自定义的ELF、DWARF和Mach-O解析器,将二进制文件的每个字节准确地归因于生成它的符号或编译单元。以下是一些使用Bloaty的基本步骤:
-
安装Bloaty:你可以从GitHub上的Bloaty仓库下载源代码,并按照README.md文件中的说明进行编译和安装。
-
运行Bloaty:在命令行中,你可以使用
bloaty [options] file...
命令来运行Bloaty,其中[options]
是一组可选的命令行参数,file...
是一个或多个要分析的二进制文件的路径。 -
理解输出:Bloaty的输出是一个分层的报告,显示了二进制文件中各个部分的大小。你可以使用多个数据源来生成这个报告,例如,你可以同时使用
segments
、sections
和symbols
数据源来查看由段、节和符号占用的空间。 -
使用配置文件:如果你有太多的输入文件无法放在命令行中,或者你想重用自定义的数据源,你可以使用配置文件。配置文件是一个Protocol Buffers文本格式的文件,其模式定义在
src/bloaty.proto
中。
当然可以。假设你有一个名为my_program
的二进制文件,你想要分析它的大小。你可以使用以下命令:
bloaty my_program
这将会输出一个报告,显示my_program
中各个部分的大小。报告的每一行都对应于一个特定的部分,每一列都对应于一个特定的度量。
如果你想要更详细的报告,你可以使用-d
选项来指定数据源。例如,以下命令将会生成一个按照段和符号分组的报告:
bloaty -d segments,symbols my_program
这将会显示出哪些符号在哪些段中占用了空间。
在Bloaty的输出中,FILE SIZE
和VM SIZE
代表了不同的概念:
-
FILE SIZE
:这是二进制文件在磁盘上占用的空间大小。这包括了所有的元数据、代码、数据,以及可能存在的填充空间。 -
VM SIZE
:这是二进制文件在内存中占用的空间大小。当二进制文件被加载到内存中执行时,只有那些实际需要的部分(例如代码和数据)才会被加载,而元数据和填充空间通常不会被加载。
因此,FILE SIZE
和VM SIZE
的大小可能会有所不同。具体的差异取决于二进制文件的具体内容和结构。
在Bloaty的输出中,每一行都代表一个特定的部分,每一列都代表一个特定的度量。以下是一些常见的度量的含义:
-
FILE SIZE
:这是二进制文件在磁盘上占用的空间大小。这包括了所有的元数据、代码、数据,以及可能存在的填充空间²。 -
VM SIZE
:这是二进制文件在内存中占用的空间大小。当二进制文件被加载到内存中执行时,只有那些实际需要的部分(例如代码和数据)才会被加载,而元数据和填充空间通常不会被加载²。 -
RATIO
:这是FILE SIZE
或VM SIZE
与总文件大小或总虚拟内存大小的比例。 -
SYMBOL
:这是符号的名称。符号是二进制文件中的一个实体,例如函数或变量。
例如,以下是一个可能的Bloaty输出:
FILE SIZE VM SIZE
-------------- --------------
22.0% 1.22Mi 0.0% 0 [Unmapped]
15.6% 873Ki 57.8% 873Ki .text
12.7% 709Ki 0.0% 0 .strtab
9.8% 547Ki 0.0% 0 .symtab
6.4% 355Ki 23.5% 355Ki .rodata
...
在这个例子中,.text
段占据了文件大小的15.6%,虚拟内存大小的57.8%。[Unmapped]
部分占据了文件大小的22.0%,但是它在虚拟内存中并没有占用任何空间,这可能是因为它包含了一些不需要加载到内存中的元数据。