首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

.bss段零初始化变量是否占用了elf文件中的空间?

在云计算领域,.bss段零初始化变量是否占用了elf文件中的空间是一个非常重要的问题。.bss段是一个特殊的段,它包含了程序中所有未初始化的全局变量和静态变量。这些变量在程序运行时会被初始化为0或者NULL。

在elf文件中,.bss段是一个不占用空间的段,它只是在程序加载时为这些变量分配内存空间。因此,.bss段零初始化变量不占用elf文件中的空间。

这个问题的答案对于理解程序的加载和运行过程非常重要,因为它涉及到程序的内存布局和初始化过程。如果程序中有大量的.bss段零初始化变量,那么这些变量在程序运行时需要占用内存空间,这可能会导致内存使用率的增加,从而影响程序的性能。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云CVM:腾讯云CVM是一种虚拟化的计算服务,可以帮助用户快速创建、部署和管理虚拟机,以满足不同应用场景的计算需求。
  • 腾讯云CLB:腾讯云CLB是一种负载均衡服务,可以帮助用户实现流量分发和负载均衡,从而提高应用程序的可用性和可靠性。
  • 腾讯云COS:腾讯云COS是一种对象存储服务,可以帮助用户存储和管理大量的数据,以支持应用程序的快速扩展和高可用性。

总之,.bss段零初始化变量不占用elf文件中的空间,但在程序运行时需要占用内存空间。理解这个问题对于优化程序性能和内存使用非常重要。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

用GCC开发STM32入门二

然后链接脚本文件告知链接器,把所有目标文件相应的段连接到一起,并把目标文件中的“变量地址”“函数地址”重定位至正确的地址空间; 编写前需要知道C程序编译后的典型内存布局 ,单片机的启动流程以及链接脚本文件的作用和编写等知识...中,需要有启动代码把这部分内容拷贝到sram中),.bss段是没有初始值的全局变量,由启动代码把这 部分内容全初始化为0;为了保证C程序的执行,还需要设置好程序运行时的堆栈区。...上面代码中的第二个循环是将.bss段清零。最后调用main进入到我们的主程序。...一般来说,目标文件包含 .text段: 可执行代码 .rodata段: 只读的数据,对应程序中的常量 .data段: 初始化的全局变量 .bss段: 未初始化的全局变量 连接器所作的工作简单的讲就是...,把所有目标文件相应的段连接到一起,并把目标文件中的“变量地址”“函数地址”重定位至正确的地址空间; 比如,对于stm32来说向量表,.text和.rodata就应该放到从0x0800 0000开始的

1.9K20

扒一扒ELF文件

.rodata section   只读数据段。此段的数据不可修改,存放常量。比如,printf中的格式化语句。 .data section   数据段。存放已初始化的全局变量、常量。....bss section   bss段。未初始化全局变量,仅是占位符,不占据任何实际磁盘空间。目标文件格式区分初始化和非初始化是为了空间效率。 ?....bss节应占0x0c大小,但只有装入内存时才会分配。 4.2 从程序执行角度看ELF文件(可执行文件) ?...data节和.bss节会被装入读写数据段。 段头表能够描述可执行文件中的节与虚拟空间中的存储段之间的映射关系。一个表项32B,说明虚拟地址空间中一个连续的片段或一个特殊的节。...3.bss段在可执行目标文件中不会有它的空间,只有当可执行目标文件装载运行时,才会被分配内存(并且位于data段内存块之后),并且初始化为0。 本文参考《深入理解计算机系统》

78020
  • Linux可执行文件与进程的虚拟地址空间

    代码段中存放的是可执行的二进制指令,数据段存放初始化过的变量,BSS段存放未初始化的变量,从装载的角度,把这些段称为segment。 32位的虚拟地址空间 ? 64位的虚拟地址空间 ?...ELF文件中,段的权限往往只有为数不多的几种组合,基本上就3种: 以代码段为代表的权限为可读可执行的段 以数据段和BSS段为代表的权限为可读可写的段 以只读数据段为代表的权限为只读的段 ELF可执行文件中有两个概念...可以发现,MemSiz比FileSiz多出了0x20个字节,十六进制的20对应的十进制是32。再来看一下这个ELF可执行文件中BSS段的大小。 ? 可以看到,BSS段的大小正好是十进制的32,。...在C语言中,没有初始化的全局变量和一些静态变量会被默认初始化为0 ,这就是原因,因为它们会被分配到BSS段上,被一次性初始化为0。...最后我们通过一个打印变量地址的小程序进行验证,仔细观察没有初始化的全局变量和一些静态变量的线性地址。 ?

    4.3K30

    认识目标文件结构

    ; (3).data,初始化数据段存放已初始化的全局变量与局部静态变量; (4).bss,未初始化数据段存放未初始化的全局变量与局部静态变量; (5).rodata,只读数据段存放程序中只读变量,...6.未初始化数据段(.bss) .bss段存放的是未初始化全局变量与局部静态变量,如 test.c 中的未初始化的全局变量 int gUninitVar 与局部静态变量 static int staVar1...这其实和不同语言与编译器的实现有关,有些编译器会将全局未初始化变量放在.bss段,有些则不放,只是预留一个未定义的全局变量符号,等到最终链接成可执行文件的时候再在.bss段分配空间。...为什么编译器把未初始化的全局变量标记为一个COMMON符号,而不直接把它当作未初始化的局部静态变量,为其在.bss段分配空间呢?...(2)链接时,读取了所有目标文件,确定了任意一个弱符号的大小。这时才在最终输出文件的.BSS段中为其分配空间。 (3)总体看来,未初始化的全局变量最终还是被放在.BSS段。

    1.2K30

    《程序员的自我修养》第三章学习笔记

    5,  关于bss段:未初始化的全局变量和静态局部变量一般放在一个”.bss”段的地方。 它只是为未初始化的全局变量和静态局部变量预留位置而已,并没有内容,在文件中不占空间。...专门针对ELF文件格式的解析器    size 可以用来查看ELF文件的代码段、数据段和bss段的长度   size main.o 3.3.1代码段 1,objdump 的参数 –s 将所有的段的内容以十六进制的方式打印出来...3.3.2数据段和只读数据段 1, “.data” :保存的是已初始化全局变量和局部静态变量 2,,”rodata”:存放的是只读数据,一般是程序中的只读变量(如用const修饰的)和字符串常量。...3.3.3 bss段 1,存放的是未初始化的全局变量和静态局部变量。不占磁盘空间 3.3.4 其他段 ?...3,ELF魔数:文件头最开始的4个字节是所有ELF都必须相同的标识码。又称为魔数。 魔数用来确认文件类型,操作系统在加载可执行文件的时候会确认魔数是否正确,若不正确则拒绝加载。

    1.2K60

    Arm放弃了自家的汇编语法?改投GNU了?

    将定义符开始的代码编译到数据段,初始化数据段 .bss .bss {subsection} 将变量存放到.bss段,未初始化数据段 .align .align{alignment}{,fill}...O3最大优化 volatile作用 volatile修饰的变量,编译器不再进行优化,每次都真正访问内存地址空间。 2....合并成一个.data section; .bss : { *(.bss) } : 将所有输入文件的.bss section合并成一个.bss section;该段通常存放全局未初始化变量 . = ALIGN...2) bin BIN文件是直接的二进制文件,内部没有地址标记。bin文件内部数据按照代码段或者数据段的物理空间地址来排列。一般用编程器烧写时从00开始,而如果下载运行,则下载到编译时的地址即可。...elf文件里面包含了符号表等。BIN文件是将elf文件中的代码段,数据段,还有一些自定义的段抽取出来做成的一个内存的镜像。 并且elf文件中代码段数据段的位置并不是它实际的物理位置。

    2.3K30

    树莓派4裸机基础教程:从hello world开始

    OBJS = $(SRCS:.c=.o) 该句表示环境变量的替换,就是将SRCS列表中的所有的.c文件名替换成.o文件名。...需要注意的是.bss段包含的是初始化为零的数据,通过将这些数据放在一个单独的节中,编译器可以在elf文件中省略一些空间。所以需要记录bss_start与bss_end段。并且将这段空间对齐。.../* loop until done */ 接着清空BSS段,BSS段通常是指用来存放程序中未初始化的或者初始化为0的全局变量和静态变量的一块内存区域...3.2 main函数的功能 在前面的汇编代码中,为C语言代码执行提供了环境,包括关闭非对齐检查、设置了栈SP的地址、清零了BSS段。这些都是为C代码的执行做准备。在C语言中做了具体的业务。...,然后在while中不断的读串口的输入。那么重点还是放在树莓派串口的初始化上。

    2.7K30

    嵌入式软件开发必知必会

    下面我们来简单归纳一下进程对应的内存空间中所包含的5种不同的数据区都是干什么的。 BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。...全局的未初始化变量存在于.bss段中,具体体现为一个占位符;全局的已初始化变量存于.data段中;而函数内的自动变量都在栈上分配空间。....bss是不占用.exe文件空间的,其内容由操作系统初始化(清零);而.data却需要占用,其内容由程序初始化,因此造成了上述情况。...bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小。data(已手动初始化的数据)段则为数据分配空间,数据保存在目标文件中。数据段包含经过初始化的全局变量以及它们的值。...BSS段的大小从可执行文件中得到,然后链接器得到这个大小的内存块,紧跟在数据段后面。当这个内存区进入程序的地址空间后全部清零。包含数据段和BSS段的整个区段此时通常称为数据区。

    97540

    day9嵌入式(2022.1.15)

    (可重定位文件) (类似于Windows中的exe) 程序文件中,需要特别关注的文件段: 备注: file 指令,查看系统中某个文件类型。....init 系统初始化代码段 .text 用户代码段 .rodata 常量数据段(只读数据段) .data 已初始化静态数据段 .bss 未初始化静态数据段 哪些段是静态不变的,哪些段是动态变化的?...备注: 局部变量和全局变量 函数内部定义的变量,称为局部变量,位于栈空间 函数外部定义的变量,称为全局变量,位于静态数据段 静态数据分为 .data和.bss int g_a=100; // .data...已初始化,则不做任何处理 char g_b; // .bss 未初始化,这块内存会被自动清零 (栈空间中的局部变量,如果未初始化,则为乱码数据(随机值)。)...多线程编程中,可能导致共享资源出现问题。 函数内部定义的局部变量,在函数结束后,会被自动释放。 static修饰符的用法: 修饰局部变量:将该局部变量置于静态数据段。

    36220

    9_重定位

    零初始化段(.bss):存放没有初始值或初始值为0的全局类变量 注释段(.comment):存放注释 ​ 注意: bss段和注释段不保存在bin/elf文件中 注释段里面的机器码是用来表示文字的 ​...,并且从低地址到高地址,段依次为:代码段、只读数据段、数据段、bss段、注释段(注意bss段和注释段不包含在elf/bin文件中) ​ 反汇编文件:relocate.dis relocate.elf:...,.bin文件中的数据结构如下图所示: ​ 上面我们写的链接脚本称为一体式链接脚本,与之相对的是分体式链接脚本,区别在于代码段(.text)和数据段(.data)的存放位置是否是分开的。 ​...这一节将通过汇编清除bss段数据,相关的工程代码放在目录 002_clean_bss 9.2.3.1 步骤1:修改汇编文件 ​ 我们在汇编文件中实现清除bss段,具体思路就是将bss段对应的地址读取,并将地址上的数据依次清零...原因:C函数中定义一个全局变量int g_i = 10;,程序中必然有4字节的空间留出来给这个变量g_i,然而链接脚本中的变量并像全局变量一样都保存在.bin文件中。

    1K10

    C程序是如何跑起来的01 —— 可执行文件的构成

    在程序编译的时候,对 C 语言代码中定义的函数、变量、未初始化的全局变量进行编译分类,放置在不同的段中: 普通代码翻译成二进制放到代码段(text)中 常量放在只读数据段(rodata)中 初始化的全局变量和静态局部变量放在数据段...(data)中 BSS 段比较特殊,未初始化的全局变量和静态变量都会放置到 bss 段中,但因为这些变量的值都是 0,没有必要再开辟空间存储,所以在可执行文件中 bss 段是不占用空间的。...但是 BSS 段的大小、起始地址、各个变量的地址信息都会分别保存在 section header table 和符号表 symtab 中,当程序运行的时候,加载器会根据这些信息在内存中紧挨着数据段之后的空间...,为 BSS 段开辟一片存储空间,为各个变量分配存储空间。...总而言之:BSS 段在可执行文件中不占用空间,在程序运行的时候才分配对应的空间。

    80531

    第013课 S3c2440代码重定位详解

    .data 数据段 rodata 只读数据段(const全局变量) bss段 (初始值为0,无初始值的全局变量) commen 注释 其中bss段和commen 注释不保存在bin文件中。...bin文件所在位置 不等于runtimeaddr ,程序本身实现重定位 bin文件/elf文件都不保存bss段 这些都是初始值为0 或者没有初始化的全局变量 程序运行时把bss段对应的空间清零 做个实验...修改主程序,尝试以整数格式输出字符,发现输出的数从0开始,应该是 全局变量被破坏了。 屏蔽掉start.S里面的清理命令,测试是否是清除bss段是清除了全局变量。...在C函数中声明改变量为extern外部变量类型,比如:extern int abc; 使用时,要取址,比如:int *p = &abc;//p的只即为lds文件中abc的值 汇编文件中可以直接使用外部链接脚本中的变量...解释一下原因: C函数中,定义一个全局变量int g_i;,程序中必然有4字节的空间留出来给这个变量g_i。

    1.5K20

    浅析C++内存布局

    (注意:初始化为0的全局变量还是被保存在BSS段),static声明的变量也存储在数据段。 .bss bss段存储没有初值的全局变量或默认为0的全局变量,属于静态内存分配。 ...bss段内容会被全部设为0。 stack stack段存储参数变量和局部变量,由系统进行申请和释放,属于静态内存分配。 stack的特点是先进先出,可用于保存/恢复调用现场。...总结 1、执行文件中包含了text、rodata、data段的内容,不包含bss段内容(一堆0放入执行文件没有意义) 2、堆和栈的内存增长方向是相反的:栈是从高地址向低地址生长,堆是从低地址向高地址生长...子进程通过execve系统调用调用加载器,加载器删除现有的虚拟内存段,创建新的代码段数据段堆栈,新堆栈被初始化为0,通过将虚拟地址空间的页映射到可执行文件的页面大小chunk,新的代码段和数据段被初始化为可执行文件的内容...中  设置堆栈、清空bss段  跳转至C语言处进入第二阶段,第二段也属于bootloader的功能,完成一些硬件资源初始化。

    1.2K40

    从一次字符串拼接失败说起

    初始化 我们知道,对于已经初始化的全局和静态变量时存放在可执行文件的数据段(.data),对于未初始化的全局和静态变量,则在BSS段中。...从上述输出可知只有i、l在.data段,其它的在.bss段,还有一个比较有意思的点就是**.bss段的数据都被0进行初始化**,针对这两个问题: • t1 t2 t3 t4都调用了构造函数(有些是拷贝有些是默认构造函数...fno-zero-initialized-in-bss** 针对上面的输出,i、l在.data段,可称之为常量初始化,而其它变量在.bss段且被0初始化,称之为0初始化。...从可执行程序的角度来说,如果一个数据未被初始化,就不需要为其分配空间,所以.data 和.bss 的区别就是 .bss 并不占用可执行文件的大小,仅仅记录需要用多少空间来存储这些未初始化的数据,而不分配实际空间...但是对于不同的编译单元中的静态变量的初始化顺序,标准没有做规定,也就是说假如两个全局静态变量A和B分别存在与两个.cc文件中,那么编译器对于这俩的初始化顺序是不确定的,而正是因为这个原因,才是导致了文章开头示例的输出结果不符合语气的关键

    24010

    ELF文件的加载过程(load_elf_binary函数详解)--Linux进程的管理与调度(十三)

    这个文件通常是在进程接收到一个缺省操作为”dump”的信号时被创建的, 其格式取决于被执行程序的可执行类型 所有的linux_binfmt对象都处于一个链表中, 第一个元素的地址存放在formats变量中...,ELF文件头节),然后567行就是比较文件头的前四个字节,查看是否是ELF文件类型定义的“\177ELF”。...填写目标文件的参数环境变量等必要信息 start_kernel宏准备进入新的程序入口 ELF文件中符号的动态解析过程 前面我们提到了内核空间中ELF文件的加载工作 内核的工作 内核首先读取ELF文件头部...同时读取段标记,以标识该段在内存中是否可读、可写、可执行。其中,文本段是程序代码,只读且可执行,而数据段是可读且可写。 从PT_INTERP的段中找到所对应的动态链接器名称,并加载动态链接器。...elf_phdata) goto out; /* bss段,brk段先初始化为0 */ elf_ppnt = elf_phdata; elf_bss = 0

    8.4K51

    【内存管理】内存布局介绍

    我们知道,通常Linux中流行的可执行文件的格式就是elf。...使用gcc编译的elf就是我们讲的elf文件,目标文件除了包含了编译后的机器指令代码,还包含其他链接信息,比如符号表,调试信息,字符串等,通常这些信息会根据不同的属性存放在不同的段(section)中,....init:程序初始化的代码段。 .text:代码段,程序编译完后的机器指令。 .data:初始化过的全局的静态变量,还有一些局部的静态变量。 .rodata:只读变量,字符串,常量等。....bss:未初始化的全局变量以及初始化为零的变量。 readelf 查看程序头 使用-l参数读下程序头(program header),它是用来描述OS是如何被映射到进程的虚拟地址空间的。...数据段的VMA属于匿名映射,bss,data段具有相同的权限,在OS加载时,会映射到数据段的VMA中。

    16410

    从零手写操作系统之RVOS内存管理模块简单实现-02

    /静态变量 动态管理内存 - 堆(heap) ---- 内存映射表(Memory Map) 可执行文件中各个段在虚拟内存中的地址,在链接阶段确定,然后程序装载阶段,就按照各个段在链接阶段设置好的虚拟地址进行装载...在编译普通的应用程序时,可以使用默认的链接器脚本,但是对于内核程序来说,它本身也是一个.elf文件,这个.elf文件该怎么组织,各个段放到内存中什么地方,这个由于和底层硬件强相关,所以需要我们自己编写相关的链接器脚本...: 在之前的环境准备小节中,我们makefile文件中编写的ld链接命令中只通过-Ttext=0x80000000命令指明了代码段的在内存中的起始地址 os.elf: ${OBJS} ${CC} ${...要在C代码中获取链接器脚本中定义的符号的值,一种常见的做法是通过在C代码中声明外部变量,并使用链接器脚本中定义的符号来初始化这些外部变量。...0位表示物理页是否分配 利用flags标记的第1位表示是否为某次分配中的最后一个物理页 ---- 内存管理模块初始化: void page_init() { /* * We reserved 8

    25340

    makefile使用.lds链接脚本以及 @,^, $,< 解析

    ,一般存在ROM、FLASH中,也就是运行这个指令时,会先将4096地址~(4096+2048)地址处的内容复制到0x30000000处运行(因为已经初始化了SDRAM以及Nand Flash)。....o文件时,这时候.lds链接脚本 又该如何安排它们在可执行文件中的顺序?...这里就需要将多个目标文件的.text、.data和.bss等段链接在一起而链接脚本文件是告诉链接器从什么地址开始放置这些段 .text:代码段,存放程序执行代码的一块内存 .data:读/写数据段,存放已初始的全局变量或静态变量的一块内存....rodata:只读数据段,存放只读数据段,比如全局const变量和#define定义的变量 .bss:存放未初始化的全局变量或静态变量,这里的变量存放只是用来预留位置,并不占用空间 常用命令: ENTRY...SECTIONS :最重要的,最基本的,也是最主要的命令,它告诉链接器如何把输入文件的各个section输出到目标文件中的各个section中去。

    79820

    深入理解Linux C语言内存管理

    data段中的静态数据区存放的是程序中已初始化的全局变量、静态变量和常量。   (3)未初始化数据区(BSS)。在运行时改变其值。...BSS 段属于静态内存分配,即程序一开始就将其清零了。一般在初始化时BSS段部分将会清零。   (4)栈区(stack)。由编译器自动分配释放,存放函数的参数值、局部变量的值等。...C语言程序编译完成之后,已初始化的全局变量保存在DATA段中,未初始化的全局变量保存在BSS段中。...TEXT和DATA段都在可执行文件中,由系统从可执行文件中加载;而BSS段不在可执行文件中,由系统初始化。BSS段只保存没有值的变量,所以事实上它并不需要保存这些变量的映像。...运行时所需要的BSS段大小记录在目标文件中,但是BSS段并不占据目标文件的任何空间。 04.png 05.png   以上两图来自于《C语言专家编程》。

    2.8K10
    领券