可执行程序中的BSS段

2024-01-21 09:38
文章标签 可执行程序 bss

本文主要是介绍可执行程序中的BSS段,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

BSS段:

BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。BSS节不包含任何数据,只是简单的维护开始和结束的地址,以便内存区能在运行时被有效地清零。BSS节在应用程序的二进制映象文件中并不存在。如果在嵌入式里,很可能没加载器,你的程序是直接由bootload程序加载到内存的。这个时候,bss区域是否被清0,要看写bootload代码的人了。因为这种bootload通常要自己写的。


    数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。

    代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。代码段是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段。

    堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)

    栈(stack):栈又称堆栈,是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

   

    ld 时把所有的目标文件的代码段组合成一个代码段,把所有的数据段组合成一个数据段。text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。

这篇关于可执行程序中的BSS段的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/629098

相关文章

Python 打包单文件可执行程序

这两天用Python写了个小工具,想要在没有安装Python的机器上执行,首先想到了pyinstaller 。 pyinstaller 打包程序通常只需要一句命令即可: 1. 打开cmd控制台,将目录切换到pyinstaller安装目录,我的在D:\python\Python36\Scripts目录下; 2. 输入命令:pyinstaller  D:\JetBrains\PyCharm\w

C/C++|如何使用GDB调试不带调试信息的可执行程序

release 和 debug 版本的区别 编译器优化 • release 版本:通常启用编译器优化(例如 -O2 或 -O3 标志),以最大化性能。编译器会尝试进行代码优化,比如内联函数、消除死代码、优化循环、减少函数调用等,从而生成运行效率更高的代码。 • debug 版本:通常禁用编译器优化(使用 -O0),以便于调试。这样可以确保生成的机器代码与源代码尽可能保持一致,使得调试器能够准确映

BSS段,数据段,代码段,堆,栈

转载自:http://www.cppblog.com/prayer/archive/2009/08/17/93594.html BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 数据段:数据段(data segment)通常是指用来存放程序中已初始

C/C++中.bss段的解释

BSS(Block Started by Symbol)这个词最初是UA-SAP汇编器(United Aircraft Symbolic Assembly Program)中的一个伪指令,用于为符号预留一块内存空间。该汇编器由美国联合航空公司于20世纪50年代中期为IBM 704大型机所开发。 后来BSS这个词被作为关键字引入到了IBM 709和7090/94机型上的标准汇编器FAP(Fortr

【MySQL】常见可执行程序

本文使用的版本是MySQL8,5.7可能会有所不同。 MySQL提供了一些重要的程序用来管理和操作数据库。这里会介绍一些常用的程序及其使用。对于MySQL程序的使用,可以查看官方帮助手册来学习。 MySQL :: MySQL 8.0 Reference Manual :: 6 MySQL Programs 程序存放位置 对于Linux,这些程序通常在 /usr/bin目录下 对

CMake编译安装、生成可执行程序、生成静态动态库以及静态动态库的链接

1 CMake介绍 CMake是一个开源的、跨平台的构建系统,用于管理软件从源代码到可执行文件的整个构建过程。它最初由Kitware公司为ITK(Insight Segmentation and Registration Toolkit)和VTK(Visualization Toolkit)等开源项目开发,后来成为了一个独立的开源项目。CMake的设计目标是让开发者能够以一种简单、统一的方式编写

helloworld 可执行程序得到的过程

// -E 预处理 开发过程中可以确定某个宏 // -c 把预处理 编译 汇编 都做了,但是不链接 // -o 指定输出文件 // -I 指定头文件目录 // -L 指定链接库文件目录 // -l 指定链接哪一个库文件 #include <stdio.h>#include <stdlib.h>#include <string.h>int main(){printf(" hello w

.net 8版本将发布的web可执行程序exe文件注册为window服务,并设置开机自启动

1、添加 NuGet 包Microsoft.Extensions.Hosting.WindowsServices 2、在Program.cs文件中添加如下: builder.Host.UseWindowsService(); 3、以管理员身份运行cmd窗口 3.1 注册服务 sc create 服务名称 binpath= F:\xxxx\mmm.exe type= own start= a

Linux中的段管理,bss段,data段

Linux 的段管理, BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 该段用于存储未初始化的全局变量或者是默认初始化为0的全局变量, data段 该段用于存储初始化的全局变量,初始化为0的全局变量出于编译优化的策略还是被保存在BSS段,数据段也是属

全局/静态变量初始化为0放在bss段还是data段

2013-6-4上午去面试,被鄙视了,技术公司大牛的风范,好犀利!不过我这题应该是蒙对了。。   如:static unsigned char s_test = 0; 这个静态变量是放到bss段还是data段呢,以下是我编译的结果:(全局变量也是如此)   1.看这样子,即使是初始化了,但是初始化的是0,还是放在bss段的 2.这里还有一个问题,即使是全局定义了一个