Hi
Ich habe ein Problem mit Globalen Variable
paging.cpp//...
namespace paging
{
DWORD PagingSpinLock = 0x00000000;
//...
Der Linker packt diese Variable in den
.bss-Bereich:
mapfile...
.bss 0x0000000000a14818 0xc mem/paging.o
0x0000000000a14818 paging::PagingSpinLock
...
Der Grund dafür: Der Compiler lässt sie in den
.bss-Bereich packen:
objdump -x paging.o...
00000000 g O .bss 00000004 _ZN6paging14PagingSpinLockE
...
Warum wird diese Variable in den .bss-Teil gepackt?
Alle Globalen Variablen die mit 0 oder false initialisiert wurden befinden sich im .bss-Segment; die mit einem Wert ungleich 0 initialisiert wurde hingegen nicht.
Der Compiler kann doch nicht einfach davon ausgehen das diese Speicherbereiche =0 sind
- Die Tatsache das sie !=0 sind sorgt nämlich für wirre Abstürze...
Meine
Compiler-settings:
COMPILERSETTINGS="-I $HEADERS -DCPU=586 -m32 -c -Os -nostdlib -fno-builtin -fno-rtti -fno-exceptions"
Compiler: g++ 4.4.1
Ich arbeite bereist seit einigen Jahren mit diesen Settings - aber bisher sind mir nie solche Probleme aufgefallen...
...erst seit wenigen Tagen
Meine Frage: Was jetzt? Wie bringe ich den Compiler dazu initialisierte Variablen nicht in den .bss-Block zu packen?
Warum geht der überhaupt davon aus, dass das bss-segment mit Nullen gefüllt ist? Überall wird doch explizit erwähnt dass dieser Speicherbereich keine definierten Werte enthält...
Nochmal die g++-version im detail:
$ g++ -v
Using built-in specs.
Target: i586-suse-linux
Configured with: ../configure --prefix=/usr --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib --libexecdir=/usr/lib
--enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.4
--enable-ssp --disable-libssp --with-bugurl=http://bugs.opensuse.org/ --with-pkgversion='SUSE Linux' --disable-libgcj
--disable-libmudflap --with-slibdir=/lib --with-system-zlib --enable-__cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch
--enable-version-specific-runtime-libs --program-suffix=-4.4 --enable-linux-futex --without-system-libunwind --with-arch-32=i586
--with-tune=generic --build=i586-suse-linux
Thread model: posix
gcc version 4.4.1 [gcc-4_4-branch revision 150839] (SUSE Linux)