This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

problem with dlclose and destructors of global objects


Hello.

I'm using gcc 3.3.2.

Here is simple example for problem that I encoutered.

test.cpp:

#include <dlfcn.h>

#include <stdio.h>

class klasa {

int m_a;

public:

klasa() {}

~klasa() {printf("~klasa\n");}

void set(int a) {m_a = a;}

int get() {return m_a;}

};

klasa Objekt;

int main(int a, char** b)

{

const char* lib = "libscaner.so";

Objekt.set(a);

if (a > 1)

lib = b[1];

void* h = dlopen(lib, RTLD_LAZY);

if (h == NULL) {

printf("Error on loading %s: %s", lib, dlerror());

return 1;

}

a=Objekt.get();

printf("loaded\n");

dlclose(h);

printf("closed\n");

return 0;

}

-------------------- end of test.cpp

testso.cpp:

#include <stdio.h>

class klasa {

int m_a;

public:

klasa2() {}

~klasa2() {printf("~klasa2\n");}

void set(int a) {m_a = a;}

int get() {return m_a;}

};

klasa2 Objekt2;

int dummy(int a) {

Objekt2.set(a);

return Objekt2.get();

}

-------------------- end of testso.cpp

I compile both files with command:

gcc -o test test.cpp -ldl -lstdc++

gcc -o libdupa.so testso.cpp -shared -fPIC

with gcc 3.3.2 on host with glibc 2.2.5.

When I run this test on the same host (and other with glibc 2.2.5 or 2.2.4)
all works ok:

$> ./test libdupa.so

loaded

~klasa2

closed

~klasa

But if I run the test on host with glibc 2.3.2 destructor of klasa is called
on dlclose:

&> ./test libdupa.so

loaded

~klasa

~klasa2

closed

Problem does not occur when I compile this test case on host with glibc
2.3.2.

Whats the problem? Is this gcc or glibc issue?

Is the problem fixed on newer gcc?

Regards

Dominik Siatkowski



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]