This is the mail archive of the gcc@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]

__attribute__((constructor)), shared object files and C++...



Hi, Posting this in gcc list for experts.
thanks,
Muthu.


---------- Forwarded message ----------
Date: Tue, 6 May 2003 16:25:53 -0700
From: "Pearson, Scott" <scott.pearson@intel.com>
To: "'gcc-help@gcc.gnu.org'" <gcc-help@gcc.gnu.org>
Subject: __attribute__((constructor)), shared object files and C++...


Hi

I have encountered a pair of related problems producing a shared object (SO)
file which exposes a C++ class.

First, consider the following non-C++ example. Here's the source for the SO
file (libtest.c):

 <<libtest.c>>
And here's the source for the test program (test.c):

 <<test.c>>
If I build the SO file and test program using a command sequence supporting
versioning (as is shown in the Shared Object File HOW-TO), such as:

		gcc -fPIC -c libtest.c
		ld -shared -soname libtest.so.1 -o libtest.so.1.0 -lc
libtest.o
		ldconfig -v -n .
		ln -sf libtest.so.1 libtest.so
		gcc -o test test.c -L. -ltest

 Then I will see (only) the following output:

	In main()
	In Test()

As you can see, the constructor and destructor I included in the SO file are
not executed.

If, however, I build the application without SO versioning, using the
more-basic set of commands:

	gcc -fPIC -c libtest.c
	gcc -shared -o libtest.so libtest.o
	gcc -o test test.c -L. -ltest

Then I will see the following output:

	In InitSO()
In main()
	In Test()
	In ExitSO()

As you can see, the constructor and destructor that I included in the SO
file are, in this case, properly executed.


That's problem #1; now, let's look at the C++ case. Here's the SO file
source (libctest.cpp):

 <<libctest.cpp>>
And here's the include file (libctest.h; which defines the class):

 <<libctest.h>>
And, finally, the test program (ctest.cpp):

 <<ctest.cpp>>
I build the SO file and test program using the following commands, similar
to the (working) non-C++ example above:

	gcc -fPIC -c libctest.cpp
	gcc -shared -o libctest.so libctest.o
	gcc -o ctest -L. -lctest -lstdc++ ctest.cpp

The output I get is:

	In cTest::cTest()
	In main()
	In cTest::Test()
	In cTest::~cTest()

As you can see, the (module-level) constructor and destructor in the SO file
are NOT executed.

Does anyone have any insights into what's going wrong here?

TIA,
Scott

N. Scott Pearson
Staff S/W Architect, Intel Desktop Boards Operation
Desktop Platform Solutions Division, Intel Corporation
Desk    503-696-7818       Cell      503-702-6412
Fax      503-696-1015       Email    scott.pearson@intel.com
<mailto:scott.pearson@intel.com>

Attachment: libtest.c
Description: Binary data

Attachment: test.c
Description: Binary data

Attachment: libctest.cpp
Description: Binary data

Attachment: libctest.h
Description: Binary data

Attachment: ctest.cpp
Description: Binary data


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