In
computer programming, the block starting symbol (abbreviated to .bss or bss) is the portion of an
object file, executable, or
assembly language
In computer programming, assembly language (or assembler language, or symbolic machine code), often referred to simply as Assembly and commonly abbreviated as ASM or asm, is any low-level programming language with a very strong correspondence ...
code that contains
statically allocated variables that are declared but have not been assigned a value yet. It is often referred to as the "bss section" or "bss segment".
Typically only the length of the bss section, but no data, is stored in the
object file. The
program loader allocates memory for the bss section when it loads the program. By placing variables with no value in the .bss section, instead of the
.data or .rodata section which require initial value data, the size of the object file is reduced.
On some platforms, some or all of the bss section is initialized to zeroes.
Unix-like
A Unix-like (sometimes referred to as UN*X or *nix) operating system
An operating system (OS) is system software that manages computer hardware, software resources, and provides common services for computer programs.
Time-sharing ope ...
systems and
Windows
Windows is a group of several Proprietary software, proprietary graphical user interface, graphical operating system families developed and marketed by Microsoft. Each family caters to a certain sector of the computing industry. For example, W ...
initialize the bss section to zero, allowing
C and
C++ statically allocated variables initialized to values represented with all bits zero to be put in the bss segment. Operating systems may use a technique called zero-fill-on-demand to efficiently implement the bss segment. In embedded software, the bss segment is mapped into memory that is initialized to zero by the C
run-time system
In computer programming, a runtime system or runtime environment is a sub-system that exists both in the computer where a program is created, as well as in the computers where the program is intended to be run. The name comes from the compile ...
before
main()
is entered. Some C run-time systems may allow part of the bss segment not to be initialized; C variables must explicitly be placed into that portion of the bss segment.
On some
computer architecture
In computer engineering, computer architecture is a description of the structure of a computer
A computer is a machine that can be programmed to carry out sequences of arithmetic or logical operations ( computation) automatically. Moder ...
s, the
application binary interface also supports an sbss segment for "small data". Typically, these data items can be accessed using shorter instructions that may only be able to access a certain range of addresses. Architectures supporting
thread-local storage might use a tbss section for uninitialized, static data marked as thread-local.
Origin
Historically, BSS (from Block Started by Symbol) is a
pseudo-operation in
UA-SAP (United Aircraft Symbolic Assembly Program), the
assembler developed in the mid-1950s for the
IBM 704 by Roy Nutt, Walter Ramshaw, and others at
United Aircraft Corporation
, former_name = OJSC United Aircraft Corporation (2006–2015)
, type = Public, PJSC
, traded_as =
, industry = Aerospace
Aerospace is a term used to collectively refer to the atmosphere and outer space
Outer space, commonly sh ...
. The BSS keyword was later incorporated into
FORTRAN Assembly Program[
] (FAP) and Macro Assembly Program
[
] (MAP),
IBM's standard assemblers for its
709 and 7090/94 computers. It defined a label (i.e. symbol) and reserved a block of uninitialized space for a given number of
words. In this situation BSS served as a shorthand in place of individually reserving a number of separate smaller data locations. Some assemblers support a complementary or alternative directive BES, for Block Ended by Symbol, where the specified symbol corresponds to the end of the reserved block.
BSS in C
In
C, statically allocated objects without an explicit initializer are initialized to zero (for arithmetic types) or a null pointer (for pointer types). Implementations of C typically represent zero values and null pointer values using a bit pattern consisting solely of zero-valued bits (despite filling bss with zero is not required by the C standard, all variables in .bss are required to be individually initialized to some sort of zeroes according to Section 6.7.8 of C ISO Standard 9899:1999 or section 6.7.9 for newer standards). Hence, the BSS segment typically includes all uninitialized objects (both variables and
constants) declared at file scope (i.e., outside any function) as well as uninitialized
static local variables (
local variables declared with the
static
keyword); static local ''constants'' must be initialized at declaration, however, as they do not have a separate declaration, and thus are typically not in the BSS section, though they may be implicitly or explicitly initialized to zero. An implementation may also assign statically-allocated variables and constants initialized with a value consisting solely of zero-valued bits to the BSS section.
Peter van der Linden, a C programmer and author, says, "Some people like to remember it as 'Better Save Space.' Since the BSS segment only holds variables that don't have any value yet, it doesn't actually need to store the image of these variables. The size that BSS will require at runtime is recorded in the object file, but BSS (unlike the data segment) doesn't take up any actual space in the object file."
BSS in Fortran
In
Fortran, common block variables are allocated in this segment.
Some compilers may, for
64-bit instruction sets, limit offsets, in instructions that access this segment, to 32 bits, limiting its size to 2 GB or 4 GB.
Also, note that Fortran does not require static data to be initialized to zero. On those systems where the bss segment is initialized to zero, putting common block variables and other static data into that segment guarantees that it will be zero, but for portability, programmers should not depend on that.
See also
*
Linker (computing)
*
Data segment
*
Code segment
*
Uninitialized variable
References
*
{{DEFAULTSORT:Bss
Executable file formats
Memory management
Assembly language
In computer programming, assembly language (or assembler language, or symbolic machine code), often referred to simply as Assembly and commonly abbreviated as ASM or asm, is any low-level programming language with a very strong correspondence ...
Programming language implementation