我在編譯一個應該是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++而不公開地暴露所有這些符號?