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

相关文章

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable