Subject: Constructor for global objects in shared lib not getting called
To: None <tech-toolchain@netbsd.org>
From: Dave Huang <khym@bga.com>
List: tech-toolchain
Date: 12/05/1998 19:37:19
I'm running -current on an i386, with egcs as the compiler, although I
haven't tried this with gcc--it may have the same problem.

Suppose I have a class MyClass... if I create an instance of MyClass by
doing "MyClass c;" at the outermost level of my program (i.e. not in a
function), MyClass's constructor gets called when the program starts...
cool.

Now, if I take the definition of MyClass and the "MyClass c;" and put
them into a shared library, the global instance of MyClass still gets
created, but its constructor is never called. It's supposed to get
called, right? The latest Mozilla thinks so...

Sample code:

===== lib.cpp =====
#include <stdio.h>

struct MyClass
{
 MyClass() {
  printf("constructed\n");
 }
};

MyClass c;

void func()
{
  printf("c is at %p\n", &c);
}

===== main.cpp =====
#include <stdio.h>

void func(void);

int main(void)
{
 func();
 return 0;
}

% c++ -c -fPIC lib.cpp
% c++ main.cpp lib.o
% a.out
constructed
c is at 0xb0c0
% ar rc libsomelib_pic.a lib.o
% ld -Bshareable -Bforcearchive -o libsomelib.so.0.0 libsomelib_pic.a
% setenv LD_LIBRARY_PATH $PWD
% c++ main.cpp -lsomelib
% a.out
c is at 0x40025078

-- 
Name: Dave Huang     |   Mammal, mammal / their names are called /
INet: khym@bga.com   |   they raise a paw / the bat, the cat /
FurryMUCK: Dahan     |   dolphin and dog / koala bear and hog -- TMBG
Dahan: Hani G Y+C 23 Y++ L+++ W- C++ T++ A+ E+ S++ V++ F- Q+++ P+ B+ PA+ PL++