>> >> >> Reference << << << <<<<<<Ref>>>>>>
>> >> >> Indexer << << << <<<<<<Idx>>>>>>
Matched: 0

Tags

    Categories

      Types

        Top Results

          size
          M: 2026-04-21 - ljf12825

          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

          • -?

          • d

          • o

          • x

          • --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可以自动识别许多格式

          • v

          • V

          • --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:未初始化数据段的大小,用于存放未赋初值的全局或静态变量
          • dectext + data + bss的总和,表示文件的实际大小
          • hexdec对应的十六进制表示
          • filename:目标文件名

          Section

          在计算机科学和程序设计中,节(section)是指在可执行文件、目标文件或库文件中按照特定功能和用途划分的一个逻辑区域。这些区域通常包含程序的不同组成部分,比如代码、数据、符号表、调试信息等

          二进制文件中常见的节

          1. .text(代码段) 该节包含了程序的可执行代码,即程序的指令。它是执行时被加载到内存中的部分,通常是只读的。.text节是程序的核心部分,执行时 CPU 会从这里加载指令

          2. .data(数据段) 该节存储已初始化的全局变量和静态变量。在编译时,这些变量被赋予初值,程序运行时就会用到这些值

          3. .bss(未初始化数据段) 该节包含未初始化的全局变量和静态变量。这些变量在程序运行时会被系统自动初始化为零。尽管这些变量在文件中没有实际数据,但他们在内存中会分配空间

          4. .rodata(只读数据段) 包含程序的只读常量数据,如字符串常量或其他只读数据。它与.text一样是只读的,不会被修改

          5. .symtab(符号表) 该节包含了程序中的符号信息,如函数、变量的名称、地址等,通常用于调试和链接。这个节在编译时被生成,但在最终的可执行文件中,可能会被去掉

          6. .strtab(符号串表) 用于存储符号表中使用的字符串,如变量名、函数名等。这是与.symtab配合使用的,帮助解析符号信息

          7. .debug(调试信息) 该节包含调试符号、源代码文件信息等,在调试时使用。它对于程序的正常执行无关紧要,但对开发者调试程序时至关重要

          8. .plt(过程链接表) 动态链接的程序中,.plt节用于支持动态链接。它包含了调用外部函数的代码

          9. .got(全局偏移表) 动态链接程序中的.got节存储了全局变量和函数的地址,用于动态链接时的符号解析

          节的特点

          • 每个节都有特定的用途:每个节在程序中都有自己的功能,例如.text存放代码,.data存放已初始化的数据,.bss存放未初始化的数据等
          • 每个节在内存中对应一个地址区域:当程序被加载到内存时,操作系统会将各个节加载到内存的不同区域,通常会依据节的类型和权限来分配内存
          • 节通常是静态的:在程序的生命周期内,节的内容通常不会改变,除非通过特殊操作(如动态链接或修改代码)

          节与段的区别

          • 节(Section):节是在源代码文件(如.c文件)或目标文件(如.o 文件)中的逻辑划分,用于组织不同类型的数据。节的划分是编译器和链接器的事情,节主要用于在编译和链接过程中对程序数据进行分类。例如.text.data.bss等。
          • 段(Segment):段是程序在内存中的布局,操作系统和链接器根据不同的需求将程序加载到内存中时,所做的内存分配。段反映了程序在内存中的运行时组织结构。每个段包含程序的一个特定部分,比如代码、数据、堆栈等。

          虽然节和段的内容可能重叠(例如.text节对应代码段,.data节对应数据段),但它们的概念和用途不同。节是编译器和链接器用于管理程序文件的结构,而段是操作系统用来组织和管理程序在内存中执行的结构