我在编译一个应该是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++而不公开地暴露所有这些符号?