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

linux elf .bss段内存开销

Linux ELF是一种可执行和可链接格式,用于在Linux系统上运行的程序。.bss段是ELF文件中的一个段,用于存储未初始化的全局变量和静态变量。在程序加载到内存时,.bss段会被分配一块内存空间,但该空间不会被实际的数据填充,而是被初始化为0。

.bss段的内存开销主要取决于程序中未初始化的全局变量和静态变量的数量和大小。由于这些变量未被初始化,它们在内存中只占用了一定的空间,而不会占用实际的数据存储空间。因此,.bss段的内存开销通常比较小。

优势:

  1. 节省存储空间:由于未初始化的全局变量和静态变量不需要实际的数据存储空间,使用.bss段可以节省存储空间。
  2. 快速加载:由于.bss段中的数据都被初始化为0,加载程序时不需要从文件中读取实际的数据,可以加快程序的加载速度。

应用场景: .bss段主要用于存储未初始化的全局变量和静态变量。这些变量在程序中可以被多个函数共享,因此适用于需要在不同函数之间传递数据的场景。例如,一个大型的软件项目中可能有多个文件,这些文件中的函数需要访问共享的全局变量,可以将这些全局变量定义在.bss段中。

腾讯云相关产品: 腾讯云提供了多种云计算产品,其中一些与Linux ELF和.bss段的内存开销相关的产品包括:

  1. 云服务器(ECS):提供了多种规格的虚拟机实例,可用于运行Linux ELF程序,并分配适当的内存空间来存储.bss段。
  2. 云存储(COS):提供了可扩展的对象存储服务,可用于存储和管理Linux ELF程序及其相关文件。
  3. 云原生容器服务(TKE):提供了容器化应用的管理和部署平台,可用于运行和管理Linux ELF程序的容器实例。

更多关于腾讯云产品的详细信息和介绍,请访问腾讯云官方网站:https://cloud.tencent.com/

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

相关·内容

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

作者简介: 本文由西邮陈莉君教授研一学生贺东升编辑,梁金荣、张孝家校对 建议结合之前的《linux内存寻址方式》看。...Linux将进程虚拟地址空间中的一个叫做虚拟内存区域(VMA)。在/proc目录下,可以查看一个进程的虚拟地址空间,通过命令 cat /proc/pid/maps ?...再来看一下这个ELF可执行文件中BSS的大小。 ? 可以看到,BSS的大小正好是十进制的32,。...这说明在实际映射的时候,数据内存中所分配的空间大小超过实际的大小,超出去的这部分空间就是BSS,并没有为BSS进行专门的映射,这就是为什么在查看程序头表时,只看到了两个LOAD类型的,而不是三个...这样做的好处就是在构造ELF可执行文件时,不需要再额外设立BSS的segment了,只需把数据segment的内存扩大,那些额外的部分就是BSS。而这部分多出的BSS空间,会被全部填充为0 。

4.2K30

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

-o nand_elf $^ arm-linux-objcopy -O binary -S nand_elf $@ arm-linux-objdump -D -m arm nand_elf...-o nand_elf $^          >    arm-linux-ld  -o nand_elf head.o init.o nand.o main.o ...这里就需要将多个目标文件的.text、.data和.bss链接在一起而链接脚本文件是告诉链接器从什么地址开始放置这些 .text:代码,存放程序执行代码的一块内存 .data:读/写数据,存放已初始的全局变量或静态变量的一块内存...__bss_start = .;                   //把__bss_start赋值为当前位置,即bss的开始位置    .bss : { *(.bss) }                 ...//指定bss,这里NOLOAD的意思是这段不需装载,仅在执行域中才会有这段    _end = .;                          //把_end赋值为当前位置,即bss的结束位置

73320

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

-o nand_elf $^ arm-linux-objcopy -O binary -S nand_elf $@ arm-linux-objdump -D -m arm nand_elf...-o nand_elf $^          >    arm-linux-ld  -o nand_elf head.o init.o nand.o main.o ...这里就需要将多个目标文件的.text、.data和.bss链接在一起而链接脚本文件是告诉链接器从什么地址开始放置这些 .text:代码,存放程序执行代码的一块内存 .data:读/写数据,存放已初始的全局变量或静态变量的一块内存...//把__bss_start赋值为当前位置,即bss的开始位置 .bss : { *(.bss) } //指定bss,这里NOLOAD的意思是这段不需装载,仅在执行域中才会有这段..._end = .; //把_end赋值为当前位置,即bss的结束位置 }

1.9K100

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

+ vaddr, elf_ppnt, elf_prot, elf_flags, total_size); } 填写程序的入口地址 完成了目标程序和解释器的加载, 同时目标程序的各个也已经加载到内存了...,然后调用mmap()把找到的可加载的内容加载到内存中。...同时读取标记,以标识该段在内存中是否可读、可写、可执行。其中,文本段是程序代码,只读且可执行,而数据是可读且可写。 从PT_INTERP的中找到所对应的动态链接器名称,并加载动态链接器。...elf_phdata) goto out; /* bss,brk先初始化为0 */ elf_ppnt = elf_phdata; elf_bss = 0...needs to go. */ /* 使用set_brk调整bss的大小 */ retval = set_brk(elf_bss, elf_brk); if (retval

7.4K51

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

将定义符开始的代码编译到数据,初始化数据 .bss .bss {subsection} 将变量存放到.bss,未初始化数据 .align .align{alignment}{,fill}...依赖lds文件编译 实际的工程文件,复杂程度远比我们这个要复杂的多,尤其Linux内核有几万个文件,的分布及其复杂,所以这就需要我们借助lds文件来定义内存的分布。 ?...linux内核的异常向量表 linux内核的内存分布也是依赖lds文件定义的,linux内核的编译我们暂不讨论,编译好之后会在以下位置生成对应的lds文件: arch/arm/kernel/vmlinux.lds...同时我们也可以看到linux内存的划分更加的复杂,后续我们讨论linux内核,再继续分析该文件。...elf文件里面包含了符号表等。BIN文件是将elf文件中的代码,数据,还有一些自定义的抽取出来做成的一个内存的镜像。 并且elf文件中代码段数据的位置并不是它实际的物理位置。

2.1K30

从一个简单的汇编程序学习汇编程序的结构以及编译链接的过程

本篇原创作者:Rj45 由于大部分的pwn都是在Linux平台下的,故下面所涉及到的汇编都是在Linux平台下的汇编。...汇编程序的结构 一个linux平台下的汇编程序的结构如下: global _start section .data section .bss section .text _start: ......2、伪指令 .section.data section.data是数据的开始,数据中要列出程序数据和其所需要的所有内存存储空间。...3、伪指令 section.bss section.bss是声明全局变量的,其内声明的变量,不会包含在可执行程序中,而是在一个内存区域被保留在运行时候使用。...-o hello//使用elf_i386链接器 ld -m elf_x86_64 hello.o -o hello//使用elf_x86_64链接器 3、例子 ?

1.6K20

散装 vs 批发谁效率高?变量访问被ARM架构安排的明明白白

: { *(.bss) } } 「Makefile」 TARGET=gcd TARGETC=main all: arm-none-linux-gnueabi-gcc -O1 -g -c...-o $(TARGET).elf arm-none-linux-gnueabi-objcopy -O binary -S $(TARGET).elf $(TARGET).bin arm-none-linux-gnueabi-objdump...「bss占用4个字节」 ? 每访问1次全局变量,总共需要3条指令,访问3次全局变量用了「12条指令」。 ? 14....通过当前pc值40008018偏移32个字节,找到xx变量的链接地址40008038,然后取出其内容40008044存放在r3中,该值就是xx在bss的地址 15....由上图可知: 结构体变量peng位于bss,地址是4000802c 访问结构体成员也需要利用pc找到结构体变量peng对应的文字池中地址40008028,然后间接找到结构体变量peng地址4000802c

84430

makefile使用.lds链接脚本以及 常用命令 解析

-o nand_elf $^ arm-linux-objcopy -O binary -S nand_elf $@ arm-linux-objdump -D -m arm nand_elf...这里就需要将多个目标文件的.text、.data和.bss链接在一起而链接脚本文件是告诉链接器从什么地址开始放置这些 .text: 代码,存放程序执行代码的一块内存 .data: 读/写数据...,存放已初始的全局变量或静态变量的一块内存 .rodata: 只读数据,存放只读数据,比如全局const变量和#define定义的变量 .bss: 存放未初始化的全局变量或静态变量,这里的变量存放只是用来预留位置...; __bss_start = .; //把__bss_start赋值为当前位置,即bss的开始位置 .bss : { *(.bss) }...//指定bss,这里NOLOAD的意思是这段不需装载,仅在执行域中才会有这段 _end = .; //把_end赋值为当前位置,即bss的结束位置

1.8K20

扒一扒ELF文件

.data section   数据。存放已初始化的全局变量、常量。 .bss section   bss。未初始化全局变量,仅是占位符,不占据任何实际磁盘空间。....bss节应占0x0c大小,但只有装入内存时才会分配。 4.2 从程序执行角度看ELF文件(可执行文件) ?...Elf32_Word p_filesz; //此成员给出在文件映像中所占的字节数。可以为0。 Elf32_Word p_memsz; //此成员给出内存映像中占用的字节数。...Elf32_Word p_flags; //此成员给出与相关的标志。 Elf32_Word p_align; //此成员给出在文件中和内存中如何对齐。...3.bss在可执行目标文件中不会有它的空间,只有当可执行目标文件装载运行时,才会被分配内存(并且位于data内存块之后),并且初始化为0。 本文参考《深入理解计算机系统》

67920

浅析C++内存布局

还可使用readelf 可显示一个或者多个elf格式的目标文件的信息 。 readelf是Linux下的分析ELF文件的命令,这个命令在分析ELF文件格式时非常有用。...常见的文件如在Linux上的可执行文件,动态库(*.so)或者静态库(*.a) 等包含ELF格式的文件。 什么是ELF文件?...现代x86-64Linux和Unix系统使用可调可链接格式(ELF)。...(注意:初始化为0的全局变量还是被保存在BSS),static声明的变量也存储在数据。 .bss bss存储没有初值的全局变量或默认为0的全局变量,属于静态内存分配。 ...bss内容会被全部设为0。 stack stack存储参数变量和局部变量,由系统进行申请和释放,属于静态内存分配。 stack的特点是先进先出,可用于保存/恢复调用现场。

1.1K40

万字连载(上):如何 Bringup SoC 芯片

有 3 种类型的 ELF 文件: 目标文件:被链接器读取,用来产生一个可执行文件或者共享库文件; 可执行文件:被操作系统中的加载器从硬盘上读取,载入到内存中去执行; 共享库文件:在动态链接的时候,由 ld-linux.so...一共有 4个(segment),前两个需要 load 到内存,它们分别是代码和数据,属性是读、执行(RE)和读、写、执行(RWE)。 代码包含了两个 section。...data 数据,通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据属于静态内存分配。 bss 通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。...BSS属于静态内存分配。 init linux定义的一种初始化过程中才会用到的,一旦初始化完成,那么这些所占用的内存会被释放掉,后续会继续说明。...文件 vmlinux 的分布: 镜像的生成 ELF 文件格式是 Linux 环境下的可执行文件格式,在 Linux 环境下,加载器根据 ELF 文件里的地址信息,就可以把它加载到内存指定的地址运行,

1.6K31

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

程序加载到内存什么地方? 程序如何执行? 一、编译环境搭建 ubuntu 20.04 使用 arm-linux-gnueabihf-gcc 7.5.0。...使用格式如下: Usage: readelf elf-file(s) (1)查看可执行文件的头部 信息 -h:用于列出 ELF 文件的头部信息,包括可执行文件运行的平台、软件版本...包括:代码 text、只读数据 rodata、数据 data、bss 等。...(data)中 BSS 比较特殊,未初始化的全局变量和静态变量都会放置到 bss 中,但因为这些变量的值都是 0,没有必要再开辟空间存储,所以在可执行文件中 bss 是不占用空间的。...但是 BSS 的大小、起始地址、各个变量的地址信息都会分别保存在 section header table 和符号表 symtab 中,当程序运行的时候,加载器会根据这些信息在内存中紧挨着数据之后的空间

65631

PWN 利用mprotect函数进行.got.plt地址的读取

mprotect函数详解 在Linux中,mprotect()函数可以用来修改一指定内存区域的保护属性 函数原型如下: #include #include <sys/mmap.h...prot可以取以下几个值,并且可以用“|”将几个属性合起来使用: PROT_READ:表示内存内的内容可读; PROT_WRITE:表示内存内的内容可写; PROT_EXEC:表示内存中的内容可执行...; PROT_NONE:表示内存中的内容根本没法访问。...,这里设置为.got.plt表的起始地址,这里不去修改bss字段是因为bss是用来存放程序中未初始化的全局变量和静态变量的一块内存区域,程序一开始执行的时候会清0,你虽然修改了里面的值,但是程序一执行就会被清...这里如果不是很理解,可以百度一下Linux权限。

52010
领券