This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
problem with dlclose and destructors of global objects
- From: "Dominik Siatkowski" <dominiks at aldec dot katowice dot pl>
- To: <gcc-help at gcc dot gnu dot org>
- Date: Wed, 12 May 2004 12:38:01 +0200
- Subject: 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