问答

为什么添加变量时.bss段不会增加?

 来源    2019-06-27    15  

最近,我了解到.bss段存储了未初始化的数据.但是,当我尝试如下的小程序并在终端中使用size(1)命令时,.bss段不会改变,即使我添加了一些全局变量.我误解了什么吗?

jameschu@aspire-e5-573g:~$cat test.c
#include <stdio.h>

int main(void)
    {
  printf("hello world\n");
  return 0;
}
jameschu@aspire-e5-573g:~$gcc -c test.c
jameschu@aspire-e5-573g:~$size test.o
   text    data     bss     dec     hex filename
     89       0       0      89      59 test.o
jameschu@aspire-e5-573g:~$cat test.c
#include <stdio.h>
int a1;
int a2;
int a3;

int main(void)
{
  printf("hello world\n");
  return 0;
}
jameschu@aspire-e5-573g:~$gcc -c test.c
jameschu@aspire-e5-573g:~$size test.o
   text    data     bss     dec     hex filename
     89       0       0      89      59 test.o

这是因为全局变量的工作方式.

正在解决的问题是,可以在几个.c文件中声明一个全局变量而不初始化它,并且不会出现重复的符号错误.也就是说,每个全局未初始化的声明都像弱声明一样工作,如果没有其他声明包含初始化,则可以将其视为外部声明.

它是如何由编译器实现的?简单:

>编译时,不是在bss段中添加该变量,而是将其添加到COMMON段.
>然而,当链接时,它将合并所有具有相同名称的COMMON变量,并丢弃已经在其他部分中的任何人.其余的将被移动到可执行文件的bss.

这就是为什么你没有在目标文件的bss中看到你的变量,而是在可执行文件中.

您可以使用更现代的大小替代方法检查对象部分的内容,例如objdump -x.并注意变量如何放在* COM *中.

值得注意的是,如果将全局变量声明为静态,则表示该变量属于该编译单元,因此不使用COMMON并获得您期望的行为:

int a;
int b;
static int c;

$size test.o
text       data     bss     dec     hex filename
 91       0       4      95      5f test.o

初始化为0将得到类似的结果.

int a;
int b;
int c = 0;

$size test.o
text      data    bss    dec     hex    filename
 91       0       4      95      5f test.o

但是,初始化为0以外的任何值都会将该变量移动到数据:

int a;
int b = 1;
int c = 0;

$size test.o
text      data    bss    dec     hex    filename
 91       4       4      99      5f test.o
相关文章
iphone – 解除分配变量时获取段错误(EXC_BAD_ACCESS)
问答好吧,我知道这个错误主要来自发送方法调用或尝试访问已经解除分配的变量. 这是问题所在: .h @interface TimeEntry : NSObject <NSCopying, NSCodi ...
当我使用python statsmodels在OLS中添加外生变量时,为什么R-Squared会减少
问答如果我正确理解OLS模型,那绝不应该这样吗? trades['const']=1 Y = trades['ret']+trades['comms'] #X = trades[['potential', ...
神秘:为什么我添加和减去另一个变量时,data.table中的as.character()函数运行得更快?
问答在将日期转换为大型数据集的字符类时,我注意到了一些非常奇怪的东西.作为一个例子,我创建了一个模拟数据集如下: DT = data.table(x=rep("2007-1-1", 1 ...
c++ do .bss段零初始化变量占用elf文件中的空间?
问答如果我理解正确,ELF文件中的.bss部分用于为零初始化变量分配空间.我们的工具链产生ELF文件,因此我的问题:.bss部分实际上是否必须包含所有这些零?看起来这样一个可怕的浪费空间,当说,我分配一个 ...
C#:将相同的对象添加到两个List变量时,该过程中克隆的对象是?
问答我有类似的东西: // Declarations: List<SomeType> list1 = new List<SomeType>(); List<SomeType& ...
javascript – 在添加由另一个变量组成的变量时获取NaN
问答var dml = 30 var dd = parseFloat(document.getElementById("DriverD").value) <----- Only ...
laravel-4 – Laravel 4在提供计数变量时从foreach循环中添加数字?
问答我将数组$cats传递给我的Laravel模板视图.它是一个包含类别数据的数据库事务的多维数组.所以它会包含以下数据: $cat[0]['id'] = 1; $cat[0]['name'] = 'Fi ...
c – 添加公共变量时崩溃
问答我有一个相当大的c程序,包括一个"Character"类.在"Character.h"中,首先声明struct CharacterSettings,然后声明Ch ...
在Swift中是否可以在运行时向对象添加变量?
问答具体来说,我想将一个enum类型的变量添加到UIView的实例中,而不进行子类化或创建扩展. 谢谢.::关于objc_setAssociatedObject()的前一个答案是正确的方法,但我认为App ...
当我向expressionengine url添加第三个段时,exp:channel:entries会停止返回结果
问答我有一个问题,其中url中的第三个"段"将导致所有exp:channel:entries停止返回结果. 示例网址: 工作正常:siteurl.com/index.php/one/t ...
ruby-on-rails – 在注册时创建用户配置文件,添加配置文件表单字段以设计注册#new form
问答我有一个rails 3.1 app with devise: >用户has_one个人资料 >个人资料belongs_to用户 >推翻了devise registration_con ...
为什么TI初始化软件示例在使用CodeSourcery gcc编译时无法正确清除BSS段
问答运行TI AM3359arm的beaglebone遇到了严重的麻烦.我正在使用代码源代码来编译代码.我尝试编译一个名为enet_lwip的示例,它使用轻量级IP(lwip)来提供http服务器. 应用 ...
警惕rapidxml的陷阱:添加节点时,请保证变量的生命周期
日志http://www.cnblogs.com/chutianyao/p/3246592.html 项目中要使用xml打包.解析协议,HQ指定了使用rapidxml--号称是最快的xml解析器. 功能很 ...
代码中函数、变量、常量 / bss段、data段、text段 /sct文件、.map文件的关系[实例分析arm代码(mdk)]
日志函数代码://demo.c #include<stdio.h> #include<stdlib.h> int global1 = 0, global2 = 0, global3 ...
.net – 在添加文本时阻止文本框滚动
问答我正在向WinForms TextBox对象添加新的日志行,这会导致文本框滚动到底部.我怎样才能防止这种情况并保持目前的位置? (一个简短的代码片段会有帮助)::实际上,AppendText()不会做 ...
通过Gurobi Python添加变量和约束的高效方法,无需枚举所有元素
问答我正在学习通过Gurobi python构建优化模型,我在找到定义决策变量和约束的pythonic方法时遇到了一些问题: 假设我有这些套装: time={morning, afternoon, eve ...
变量 – 如何在命令行中传递变量时修复DTSX优先约束评估错误?
问答我有一个带有优先约束的dtsx包,用于计算表达式和约束.约束是"成功",表达式是"@myVariable"== 3. myVariable是一个int32,当在 ...
linux – 如何在向tar添加文件时指定任意前导路径?
问答是否可以在tar存档中设置任意路径以放置原始文件系统上可能不存在的文件?这与-C开关的不同之处在于我可能需要备份/ etc /,但是将它作为/ configurations / etc /放在存档中. ...
c – 访问使用def文件导出的静态变量时发生崩溃
问答我正在使用def文件从dll导出一些静态函数和变量.导入dll后访问静态变量时,程序崩溃.任何想法为什么会这样?我使用的是VS2017,Windows SDK 10.0.17763.0. librar ...