Hi Ian, Thanks for the information. I will take a look at the manual. When you talk about the attribute, does that mean I need to change my source code? Do you think the new option -fvisibility=hidden in gcc 4.0.0 would solve this issue? I am using gcc 3.3.2.
Once again, thank you, Hongbo. -----Original Message----- From: Ian Lance Taylor [mailto:[EMAIL PROTECTED] Sent: Wednesday, June 28, 2006 10:09 PM To: Li, Hongbo [CAR:PK17:EXCH] Cc: gcc@gcc.gnu.org Subject: Re: How to control to use the function static linked to a shared library "Hongbo Li" <[EMAIL PROTECTED]> writes: This question would be more appropriate for the gcc-help mailing list rather than the gcc mailing list. > I currently hit an issue that I would like to use a function > statically linked to a shared library but my program use the same > function from another shared library. Here is what I do: > > 1. I have toto.cxx that has one function called: toto() {cout << > "static toto" << endl;} > 2. I create an archive say toto.a has the toto.o > 3. I have toto1.cxx that has one functin called toto() {cout cout > <<"shared toto"<<endl;} > 4. I create a shared libtoto1.so > 5. I have use_toto.cxx that has one function called use_toto() { > toto();}: > 6. I create a shared libuse_toto.so that statically link to toto.a > 7. My main program test.cxx calling use_toto() > > I would like to always see the output of "static toto" but the output > depends on the order of linking toto1.so and use_toto.so > > I will see "static toto" when I do this > g++ -o test -L./ -luse_toto -ltoto1.so ./test.o > > But I see "shared toto" if I change the order: > g++ -o test -L./ -ltoto1.so -luse_toto ./test.o > > > My question: do we have any way during the compilation/link to > control the program so that toto() in toto.cxx is always used? Since I > may not have way to control how to build the main program, is there a > way to build libuse_toto.so so that toto() in toto.cxx is always used? As you have discovered, the order on the link line determines when symbols will be used. You can force a few other possibilities by using a linker version script or by setting the visibility attributes. See the linker manual for version scripts and the gcc manual for attributes. Ian