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]

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


Title: __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:

 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

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]