关于BSS段的大小问题

2024-02-18 13:58
文章标签 问题 大小 bss

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

在SHLUG上有人提出个问题,如下:

《C专家编程》书上119页有这么一句话:由于BSS段只保存没有值的变量,所以事实上它并不需要保存这些变量的映像。运行时所需要的BSS段的大小记录在目标文件中,但BSS段并不占据目标文件的任何空间

我做了下实验:
$cat hello.c
int a[1000];
int main()
{
printf("Hello, world!\n");

return 0;
}

$gcc hello.c
$size a.out

text           data     bss     dec     hex filename
1129     504    4032    5665    1621 a.out

 按照书上所讲数组a应该是保存在bss段的,但是" 它并不需要保存这些变量的映像", 那为什么bss段会有大小?怎么理解" 它并不需要保存这些变量的映像"这句话?

我查了一些资料,我觉的这个问题可以这样解释。
在《程序员的自我修养》一书中,作者对BSS段的描述是:“ BSS段存放的是未初始化的全局变量和局部变量。。。 其实更准确的说法是
BSS段为它们预留了空间”。(在第66页)
然后,我们来看ELF的说明文档中的原话:
.bss This section holds uninitialized data that contribute to the program's memory image. By definition, the system initialize the
data with zeros when the program begins to run. The section occupies no file space, as indicated by the section type, SHT_NOBIT。
BSS段的类型是SHT_NOBIT,其属性是SHF_ ALLOC+SHF_WRITE。
先来看看ELF文 档对SHT_NOBIT类型的描述和对SHF_ALLOC、 SHF_WRITE的描述:
SHT_NOBIT    A section of this type occupies no space in the file but otherwise resembles SHT_PROGBITS. Although this section contains no bytes, the sh_offset member contains the conceptual file offset.
SHF_WRITE    The section contains data that should be writable during process execution.
SHF_ALLOC    The section occupies memory during process execution. Some control section do not reside in the memory image of an object file; this attribute is off for those sections.
到这里,可以得出如下结论了:
(1)《程序员的自我修养》一书中的相关的描述是不恰当的, 至少是会让人产生误解的,而你看到的《专家编程》 中的话是比较靠谱的
(2)你用size命令查看到的bss段的所谓的大小, 也只是个“大小”而已,在文件中不会有它实际的空间, 只有该文件被装载执行的时候,
才会被分配内存,并且初始化为0。( 你可以做个试验,你可以看一下现在你的hello.o的大小, 然后将你的数组的长度加大10倍,再看一下
hello.o的大小,看有没有什么变化)
(3)至于bss段下面显示的“大小”,“the sh_offset member contains the conceptual file offset”这句话就可以解释啦!


这篇关于关于BSS段的大小问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

Springboot如何正确使用AOP问题

《Springboot如何正确使用AOP问题》:本文主要介绍Springboot如何正确使用AOP问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录​一、AOP概念二、切点表达式​execution表达式案例三、AOP通知四、springboot中使用AOP导出

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM