首页
学习
活动
专区
工具
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.7K20

扒一扒ELF文件

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

64320

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

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

4.1K30

认识目标文件结构

; (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.1K30

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

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都必须相同标识码。又称为魔数。 魔数用来确认文件类型,操作系统在加载可执行文件时候会确认魔数是否正确,若不正确则拒绝加载。

1K60

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.1K30

嵌入式软件开发必知必会

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

88740

树莓派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.2K30

day9嵌入式(2022.1.15)

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

32920

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文件

90210

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

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

63131

浅析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.1K40

第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.4K20

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

初始化 我们知道,对于已经初始化全局和静态变量时存放在可执行文件数据(.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文件,那么编译器对于这俩初始化顺序是不确定,而正是因为这个原因,才是导致了文章开头示例输出结果不符合语气关键

18810

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

7.2K51

手写操作系统之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

15740

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中去。

69520

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

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

1.9K100

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

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

2.7K10
领券