2013-07-30 42 views
2

我在編譯一個應該是LD_PRELOAD編輯到其他應用程序的共享對象(.so)。我使用-static-libgcc -static-libstdc++靜態鏈接libstdC++和libgcc以避免分片對象衝突。然而,這樣做會讓我在libstdC++中將所有的東西公開爲公共符號。當我做Linux g ++:與靜態libstdC++鏈接而不導出它

nm -D mylib.so 

我得到了很多的東西一樣

00000000000714e0 W _ZNKSt15basic_streambufIcSt11char_traitsIcEE4gptrEv 
0000000000071530 W _ZNKSt15basic_streambufIcSt11char_traitsIcEE4pptrEv 
00000000000714d0 W _ZNKSt15basic_streambufIcSt11char_traitsIcEE5ebackEv 
00000000000714f0 W _ZNKSt15basic_streambufIcSt11char_traitsIcEE5egptrEv 
0000000000071540 W _ZNKSt15basic_streambufIcSt11char_traitsIcEE5epptrEv 
0000000000071520 W _ZNKSt15basic_streambufIcSt11char_traitsIcEE5pbaseEv 
00000000000712a0 W _ZNKSt15basic_streambufIcSt11char_traitsIcEE6getlocEv 

這是不好的,因爲當這種等都將LD_PRELOADed成C++應用程序,這些符號將要重寫應用程序的符號,引起意外的行爲。

那麼我怎樣才能使gcc鏈接靜態地libstdC++而不公開地暴露所有這些符號?

回答

相關問題