关于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

相关文章

springboot3.4和mybatis plus的版本问题的解决

《springboot3.4和mybatisplus的版本问题的解决》本文主要介绍了springboot3.4和mybatisplus的版本问题的解决,主要由于SpringBoot3.4与MyBat... 报错1:spring-boot-starter/3.4.0/spring-boot-starter-

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题

《解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题》在Spring开发中,@Autowired注解常用于实现依赖注入,它可以应用于类的属性、构造器或setter方法上,然... 目录1. 为什么 @Autowired 在属性上被警告?1.1 隐式依赖注入1.2 IDE 的警告:

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

关于Nginx跨域问题及解决方案(CORS)

《关于Nginx跨域问题及解决方案(CORS)》文章主要介绍了跨域资源共享(CORS)机制及其在现代Web开发中的重要性,通过Nginx,可以简单地解决跨域问题,适合新手学习和应用,文章详细讲解了CO... 目录一、概述二、什么是 CORS?三、常见的跨域场景四、Nginx 如何解决 CORS 问题?五、基

MySQL安装时initializing database失败的问题解决

《MySQL安装时initializingdatabase失败的问题解决》本文主要介绍了MySQL安装时initializingdatabase失败的问题解决,文中通过图文介绍的非常详细,对大家的学... 目录问题页面:解决方法:问题页面:解决方法:1.勾选红框中的选项:2.将下图红框中全部改为英

Nginx启动失败:端口80被占用问题的解决方案

《Nginx启动失败:端口80被占用问题的解决方案》在Linux服务器上部署Nginx时,可能会遇到Nginx启动失败的情况,尤其是错误提示bind()to0.0.0.0:80failed,这种问题通... 目录引言问题描述问题分析解决方案1. 检查占用端口 80 的进程使用 netstat 命令使用 ss

MySQL8.0设置redo缓存大小的实现

《MySQL8.0设置redo缓存大小的实现》本文主要在MySQL8.0.30及之后版本中使用innodb_redo_log_capacity参数在线更改redo缓存文件大小,下面就来介绍一下,具有一... mysql 8.0.30及之后版本可以使用innodb_redo_log_capacity参数来更改

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作