编译bss
❶ 编译器编译高级语言为低级语言的时候,给全局变量或静态变量是如何分配内存的
对于C和C++的编译器,全局变量和静态变量都是在专门的数据区保存的,更具体一点,一般是在.data和.bss段保存的,具体在哪个段,编译器会根据代码中是否对这些变量进行了初始化来决定,如果初始化过,并且初始化的值不为0,那么这个这个变量一般就会被放在编译结果的.data段中,否则就是放在.bss段中。
.data段中就保存变量的符号,还保存变量的初始化值,而在.bss段中,只保存变量的符号,而不保存值,这是因为这部分的变量都将被初始化为0,这也是为什么static声明的变量即使没有初始化也会是0的原因。
这些段都会在程序被执行的时候由操作系统(或链接器)加载到指定的内存中,便完成相应的初始化。
❷ mac book pro下如何编译和运行汇编程序
汇编程序由定义好的段构成,每个段都有不同的目的,三个最常用的段:
1)data 段
汇编程序data(数据)段是可选的。
数据段声明带有初始值的数据元素,这些数据元素用作汇编程序的变量。
2)bss 段
汇编程序bss段 是可选的。
bss段声明使用零(或 NULL)值初始化的数据元素。这些元素最常用作汇编程序中的缓冲区
3)text 段
汇编程序必须有 text(文本)段。
这个段是 在可执行程序内声明指令码 的地方。
定义段:
GNU汇编器使用 .section 命令语句声明段。
.section 语句只使用一个参数------它声明的段的类型
❸ BSS的基本介绍
是“Block Started by Symbol”的缩写,意为“以符号开始的块”。
BSS是Unix链接器产生的未初始化数据段。其他的段分别是包含程序代码的“text”段和包含已初始化数据的“data”段。BSS段的变量只有名称和大小却没有值。此名后来被许多文件格式使用,包括PE。“以符号开始的块”指的是编译器处理未初始化数据的地方。BSS节不包含任何数据,只是简单的维护开始和结束的地址,以便内存区能在运行时被有效地清零。BSS节在应用程序的二进制映象文件中并不存在。
❹ DSP编译显示 cannot allocate bss in SARAM 怎么回事
SARAM的尺寸放不下未初始化段,bss是为程序中的不需要初始值的变量申请空间的段,具体可以参看编译生成的.map文件,编译的.cmd文件中bss段实际尺寸、bss段放置位置,和SARAM中实际剩余空间尺寸。
❺ BSS是什么意识
BSS全名为:Base Station Subsystem,GSM网络中的基站子系统模块 。
WLAN中的BSS:一种特殊的Ad-hoc LAN的应用,称为Basic Service Set (BSS),一群计算机设定相同的BSS名称,即可自成一个group,而此BSS名称,即所谓BSSID。
是“Block Started by Symbol”的缩写,意为“以符号开始的块”。
BSS是Unix链接器产生的未初始化数据段。其他的段分别是包含程序代码的“text”段和包含已初始化数据的“data”段。BSS段的变量只有名称和大小却没有值。此名后来被许多文件格式使用,包括PE。“以符号开始的块”指的是编译器处理未初始化数据的地方。BSS节不包含任何数据,只是简单的维护开始和结束的地址,以便内存区能在运行时被有效地清零。BSS节在应用程序的二进制映象文件中并不存在。
在采用段式内存管理的架构中(比如intel的80x86系统),bss段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss 段部分将会清零。bss段属于静态内存分配,即程序一开始就将其清零了。
比如,在C语言之类的程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。
text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。
❻ 静态编译 64位系统 Bss段大小最大是多少
39KB。
在BSS段,则可执行文件将开辟一个10000大小的空间,并全部存储为0,int为4字节的情况下,该变量将在磁盘上占用39KB的空间。但是此时若是存在BSS段,则在可执行文件中,将只是记录现在的BSS段总大小为40000即可,而无需真正的占据39KB的空间。
静态编译,就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应静态库(.a或.lib)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。
❼ 编译时分配内存和运行时分配内存
编译其实只是一个扫描过程,进行词法语法检查,代码优化而已,编译程序越好,程序运行的时候越高效。
我想你说的“编译时分配内存”是指“编译时赋初值”,它只是形成一个文本,检查无错误,并没有分配内存空间。
当你运行时,系统才把程序导入内存。一个进程(即运行中的程序)在主要包括以下五个分区:
栈、堆、bss、data、code
代码(编译后的二进制代码)放在code区,代码中生成的各种变量、常量按不同类型分别存放在其它四个区。系统依照代码顺序执行,然后依照代码方案改变或调用数据,这就是一个程序的运行过程。
❽ 结构体定义编译后是放在哪里的 BSS段、数据段、代码段、堆还是栈
只是自己定义了一个结构体类型,如果不定义变量,编译后代码 当然在代码段;如果定义了结构体变量,则这个变量放在数据段。
举个例子,
struct aa
{
int a;
char b;
};//这里只是声明,当然编译后在代码段
你定义变量时候
int a;//系统预定义的整型,a在数据段
struct aa number;//number算是结构体类型aa,也在数据段,只是类型不是预定义而已。
ps:纯手工,加分~
有问题,q我,270495267
❾ 编译时分配内存和运行时分配内存的理解,麻烦讲解下
编译时无所谓分配内存,程序在加载后才占用内存,不知道你说的是不是说编译生成的目标文件所占的空间,目标文件里的各个段.bss .data .text等都要占据一定空间,而运行时随时都在分配内存,堆栈都是内存。
不管是局部的还是全局静态变量,都会占用目标文件的空间,但是也可以不初始化,不初始化的保存在.bss段,初始化的保存在.data段。