Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Null-initialisierte Daten in BSS-Segment?

7 views
Skip to first unread message

Andreas Heyer

unread,
Mar 16, 2005, 11:44:52 AM3/16/05
to
Hallo NG,

mir ist aufgefallen, dass mit Null initialisierte Daten im
BSS-Segment abgelegt werden, welches eigentlich für
uninitalisierte Werte zuständig ist.

Folgender Test:

//test.cpp
//Compile with /c /FHsc

int Val0=0;
int Val1=1;


Im generierten ASM-Code liegt Val0 in _BSS und Val1 in _DATA!
Kann mir jemand den Unterschied zwischen 0 und 1 (bzw. einer
anderen Zahl) erklären? Oder ist das ein Bug, was ich aber nicht
glaube!

MfG
Andreas

Jochen Kalmbach

unread,
Mar 16, 2005, 1:56:15 PM3/16/05
to
Hallo Andreas,

Sinn und Zweck des BSS-Segmentes ist es nur, dass die EXE/DLL für diese
Daten im Image keinen Platz vorsehen muss. Alles was als global/static
declariert ist (oder mit 0 initialisiert wurde) macht die EXE/DLL nicht
größer.

Leider ist die Namensgebung für BSS entwas unschön geraten
(uninitialized data), da das segment sehr wohl initialisiert wird (aber
eben erst vom OS-Loader) und zwar mit 0.

Und leider gibt es darüber auch nicht eine so tolle Doku...

Aber als Anhaltspunkt dient: Initializing Scalar Types
http://msdn.microsoft.com/library/en-us/vccelng/htm/decla_29.asp

<quote>
If you do not explicitly initialize a global static variable, it is
initialized to 0 by default, and every member that has pointer type is
assigned a null pointer.
</quote>

Und siehe: Peering Inside the PE: A Tour of the Win32 Portable
Executable File Format
http://msdn.microsoft.com/library/en-us/dndebug/html/msdn_peeringpe.asp

<quote>
The .bss section is where any uninitialized static and global variables
are stored.
</quote>

Nimmt man die beiden Aussagen zusammen erkennt man, dass BSS mit 0
initialisiert wird.


Beachte auch, dass das folgende Beispiel "Val" und "Val0" in BSS
plaziert:

int Val;
int Val0 = 0;
int Val1 = 1;

--
Greetings
Jochen

My blog about Win32 and .NET
http://blog.kalmbachnet.de/

Andreas Heyer

unread,
Mar 16, 2005, 2:37:00 PM3/16/05
to
Hallo Jochen,

"Jochen Kalmbach" <nospam-Joch...@holzma.de> wrote:
> Leider ist die Namensgebung für BSS entwas unschön geraten
> (uninitialized data), da das segment sehr wohl initialisiert
> wird (aber
> eben erst vom OS-Loader) und zwar mit 0.

Also so wie ZERO_MEMORY bei den Alloc-Funktionen.
Also wird diese Optimierung nur gemacht, damit man in den PEs
Nullen spart? Macht allerdings den ASM-Code nicht unbedingt
klarer ;-)

MfG
Andreas

0 new messages