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]

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


Hi,

I can try to explain the C case... but again, I am not an expert and what
I say may be completely wrong :)


>  <<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


I looked into the generated ELF file for this case and found that it lacks
.init and .fini sections which has the constructors and destructors. So I
tried the following

    gcc -shared -Wl,-soname -Wl,libtest.so.1 -o libtest.so.1.0 -lc libtest.o

and I see the .init and .fini sections and the executable calls the
constructors and destructors correctly. The explanation I can think of is
__attribute__ key word is for gcc and not recognized by ld.

I think for ld to recognize the constructors and destructors you need to
specify it in the linker script. Sorry I am not familiar with the C++
case.

I would really like to know how to make the above C ex. work
using ld (using some linker scripts???)

Could some one experienced throw some light?

Thanks,
Muthu



> 		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>
>
>




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