GNUsize工具列出每个二进制文件(objfile)的各节(section)大小以及总大小。默认情况下,对于每个文件或每个归档文件的每个模块,都会生成一行输出
基本语法
size [options] file...
常见选项
使用这些选项之一,可以选择GNUsize输出的格式
-A或--format=sysv:使输出类似于System V的size格式-B或--format=berkeley:使输出类似于Berkeley的size格式-G或--format=gnu:选择GNU的输出格式,这与Berkeley格式相似,但大小的计算方式不同
显示可接受的参数和选项的摘要
--help-h-H-?dox--radix=number使用这些选项之一,您可以控制每个节的大小是以十进制(-d或--radix=10)、八进制(-o或--radix=8)还是十六进制(-x或--radix=16)表示。在--radix=number中,只支持三种进制:8、10、16。 总大小总是以两种进制显示:十进制和十六进制(如果使用-d或-x输出)或八进制和十六进制(如果使用-o)common:显示每个文件中公共符号的总大小。在使用Berkeley或GNU格式时,这些符号被包括在bss大小中-t--totals:显示所有列出的对象的总计(仅在Berkeley或GNU格式模式下有效)--target=bfdname:指定objfile的目标代码格式为bfdname。这个选项可能不必要,size可以自动识别许多格式vV--version显示size的版本号-f:忽略此项。这个选项被size的其他版本使用,但GNU Binutils版本不支持它@file:从文件中读取命令行选项。读取的选项将被插入到原始的@file选项中。如果文件不存在或无法读取,则该选项将被按字面意义处理,而不会被删除。 文件中的选项用空格分隔。选项如果包含空格,可以通过将整个选项用单引号或双引号括起来来包括空格。任何字符(包括反斜杠)可以通过在字符前加上反斜杠来包含。文件本身可以包含额外的@file选项;任何此类选项将递归处理
输出
假设运行命令
size hello.o
可能会看到如下输出
text data bss dec hex filename
1024 512 256 1792 700 hello.o
text:代码段的大小,也就是存储程序指令的地方data:已初始化数据段的大小,即程序中已经赋值的全局或静态变量所占用的空间bss:未初始化数据段的大小,用于存放未赋初值的全局或静态变量dec:text + data + bss的总和,表示文件的实际大小hex:dec对应的十六进制表示filename:目标文件名
Section
在计算机科学和程序设计中,节(section)是指在可执行文件、目标文件或库文件中按照特定功能和用途划分的一个逻辑区域。这些区域通常包含程序的不同组成部分,比如代码、数据、符号表、调试信息等
二进制文件中常见的节
.text(代码段) 该节包含了程序的可执行代码,即程序的指令。它是执行时被加载到内存中的部分,通常是只读的。.text节是程序的核心部分,执行时 CPU 会从这里加载指令.data(数据段) 该节存储已初始化的全局变量和静态变量。在编译时,这些变量被赋予初值,程序运行时就会用到这些值.bss(未初始化数据段) 该节包含未初始化的全局变量和静态变量。这些变量在程序运行时会被系统自动初始化为零。尽管这些变量在文件中没有实际数据,但他们在内存中会分配空间.rodata(只读数据段) 包含程序的只读常量数据,如字符串常量或其他只读数据。它与.text一样是只读的,不会被修改.symtab(符号表) 该节包含了程序中的符号信息,如函数、变量的名称、地址等,通常用于调试和链接。这个节在编译时被生成,但在最终的可执行文件中,可能会被去掉.strtab(符号串表) 用于存储符号表中使用的字符串,如变量名、函数名等。这是与.symtab配合使用的,帮助解析符号信息.debug(调试信息) 该节包含调试符号、源代码文件信息等,在调试时使用。它对于程序的正常执行无关紧要,但对开发者调试程序时至关重要.plt(过程链接表) 动态链接的程序中,.plt节用于支持动态链接。它包含了调用外部函数的代码.got(全局偏移表) 动态链接程序中的.got节存储了全局变量和函数的地址,用于动态链接时的符号解析
节的特点
- 每个节都有特定的用途:每个节在程序中都有自己的功能,例如
.text存放代码,.data存放已初始化的数据,.bss存放未初始化的数据等 - 每个节在内存中对应一个地址区域:当程序被加载到内存时,操作系统会将各个节加载到内存的不同区域,通常会依据节的类型和权限来分配内存
- 节通常是静态的:在程序的生命周期内,节的内容通常不会改变,除非通过特殊操作(如动态链接或修改代码)
节与段的区别
- 节(Section):节是在源代码文件(如
.c文件)或目标文件(如.o文件)中的逻辑划分,用于组织不同类型的数据。节的划分是编译器和链接器的事情,节主要用于在编译和链接过程中对程序数据进行分类。例如.text,.data和.bss等。 - 段(Segment):段是程序在内存中的布局,操作系统和链接器根据不同的需求将程序加载到内存中时,所做的内存分配。段反映了程序在内存中的运行时组织结构。每个段包含程序的一个特定部分,比如代码、数据、堆栈等。
虽然节和段的内容可能重叠(例如.text节对应代码段,.data节对应数据段),但它们的概念和用途不同。节是编译器和链接器用于管理程序文件的结构,而段是操作系统用来组织和管理程序在内存中执行的结构