深入理解BSS(Block Started by Symbol)
理解ELF的BSS section, 可以概括为:
- Uninitialized global/static data
- "Block Started by Symbol"
- "Better Save Space"
- Has section header but occupies no space
CSAPP一书对bss的描述如下:

.bss: 未被初始化的全局的C变量。这一节在o文件中不占实际的空间,只是一个place holder。o文件格式之所以区分初始化的变量和未被初始化的变量是因为处于空间利用率上的考虑。没有被初始化的变量确实没有必要占用实际的磁盘空间。

关于"Better Save Space", 维基百科上是这么说的, (原文点这里)
Peter van der Linden, a C programmer and author, says, "Some people like to
remember it as 'Better Save Space.' Since the BSS segment only holds variables
that don't have any value yet, it doesn't actually need to store the image of
these variables. The size that BSS will require at runtime is recorded in the
object file, but BSS (unlike the data segment) doesn't take up any actual space
in the object file."
另外, 在Memory Layout of C Programs一文中,对BSS的描述如下:
Uninitialized data segment, often called the “bss” segment, named after an
ancient assembler operator that stood for “block started by symbol.” Data
in this segment is initialized by the kernel to arithmetic before the program
starts executing uninitialized data starts at the end of the data segment and contains all global
variables and static variables that are initialized to zero or
do not have explicit initialization in source code. For instance a variable declared static int i; would be contained in the BSS segment.
For instance a global variable declared int j; would be contained in the BSS segment.
这里明确了那些初始化为0的全局变量和静态变量也是被保存在bss中。 也就是说,bss包含:
- 所有未被显示地初始化的全局变量和静态变量
- 所有被显示地初始化为0的全局变量和静态变量
If a variable declared static int i; it would be contained in the BSS segment.
If a global variable declared int j; it would be contained in the BSS segment.
If a variable declared static int i = ; it would be contained in the BSS segment.
If a global variable declared int j = ; it would be contained in the BSS segment.
深入理解BSS(Block Started by Symbol)的更多相关文章
- 格而知之16:我所理解的Block(2)
11.那么Block到底是怎么实现的呢?试一试通过将Block 的代码转换成普通C语言代码来查看它的实现过程. 要将OC代码转换成C语言代码,可以使用clang编译的一个命令: 通过这个命令能把指定文 ...
- 【读书笔记】【深入理解ES6】#6-Symbol和Symbol属性
在ES5及早期版本中,JS语言包含5中原始类型: 字符串型 数字型 布尔型 null undefined ES6引入了第六种原始类型: Symbol 创建Symbol let firstName = ...
- 格而知之16:我所理解的Block(3)
23.在前文中的例子中,Block结构体里的isa指针还没有详细讲解,这个指针都被置向了_NSConcreteStackBlock,它标识了Block的类型. 其实除了_NSConcreteStack ...
- 格而知之15:我所理解的Block(1)
1.Block 本质上是一个struct结构体,在这个结构体中,最重要的成员是一个函数(当然除函数外还有其他重要的成员). 2.在开始解析Block之前,首先来回顾一下Block的格式.Block相关 ...
- Linux 深入理解inode/block/superblock
基础命令学习目录首页 原文链接:https://blog.csdn.net/Ohmyberry/article/details/80427492 档案系统特性 传统的磁盘与档案系统之应用中,一个分割槽 ...
- 五个数据段之代码段、数据段、BSS、栈、堆
继上文讲完了对内存管理的一些知识,下面笔者再对上篇文章的内容加以拓展,那么我们今天就来说一说5个数据段 五个数据段 进程(执行的程序)会占用一定数量的内存,它或是用来存放磁盘载入的程序代码,或是存放取 ...
- linux下的a.out文件
当然这里,我更重要的是强调这个什么段,什么段.这以前就知道.但其实是对一个可以执行的c语言程序的分析.就好比你分析一篇作文.有标题.有段落. .out文件就是扩展名为out的文件,它本身不代表任 ...
- LINUX命令总结 -------来自 水滴娃娃 的CSDN
LINUX命令总结 标签: LINUX命令总结 2014-01-27 15:54 41039人阅读 评论(1) 收藏 举报 分类: linux(1) 版权声明:本文为博主原创文章,未经博主允许不得 ...
- C程序的构成及动态内存分配
对一个程序,通常的理解就是,源码编译成机器代码,然后通过机器解释运行.不过是怎样编译成机器代码,和怎样运行的,无疑是个值得探讨的问题.怎样编译成机器代码,过程就是源码的编译.链接,编译器做了这些事.而 ...
随机推荐
- Android-ContentProvider-UriMatcher
注意:在ContentProvider里面写对数据库增删改查的时候,千万不能 db.close(); cursor.close(); 等操作,不然其他应用访问不到数据,也没有必要写isOpen(); ...
- Android-帧布局(FrameLayout)
帧布局的特点是,一层一层的覆盖在上面 帧布局,使用比较多的属性是: android:layout_gravity="bottom" 也支持这些属性的设置: <!-- andr ...
- 微软2014实习生招聘笔试第2题 the k-th string
Time Limit: 10000msCase Time Limit: 1000msMemory Limit: 256MB Description Consider a string set that ...
- linux权限及目录
[-][rwx][r-x][r--] r:4 - 读 w:2 - 写 x:1 - 执行 1:代表文件类型 2:代表文件所有者的权限 3:代表文件所在组的权限 4:代表其他用户的权限 chgrp:修 ...
- docker+selenium grid解决node执行经常卡死
执行用例时出现下图: 可以在启动node节点容器时添加如下红色字体的参数 docker run -d -p 5903:5900 --shm-size=512m --link selenium_hub: ...
- day04.3-生成器
1. 生成器可以理想为一种数据类型,这种数据类型自动实现了迭代器协议(其他数据类型需要调用自己内置的__iter__方法),所以生成器就是可迭代对象. 2. 生成器分类及在python中的表现形式 生 ...
- “全栈2019”Java第三十五章:面向对象
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- codeforces785E
http://codeforces.com/contest/785/problem/E 一道经典的求逆序对的题目,可以用树状数组套平衡树解决 平衡树需要支持插入一个数,删除一个数,找比 x 小的数的个 ...
- Java 之封装
预备知识: public:可以被所有其他类所访问 private:只能被自己访问和修改 protected:自身.子类及同一个包中类可以访问 default:同一包中的类可以访问,声明时没有加修饰符, ...
- 本机安装mysql服务
Windows 上安装 MySQL Windows 上安装 MySQL 相对来说会较为简单,你需要在 MySQL 下载中下载 Windows 版本的 MySQL 安装包. Download Link: ...