我正在编译一个应该LD_PRELOAD
加入其他应用程序的共享对象(.so)。我使用-static-libgcc -static-libstdc++
静态链接libstdc ++和libgcc以避免分片对象冲突。
然而,这样做会使我在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 ++?
答案 0 :(得分:0)
您可以使用visibility pragmas和visibility function attributes。
您可能希望hidden
或protected
可见。
我不确定您是否可以静态链接libstdc++
:结果mylib.so
可能包含非position independent code。另请阅读this answer,它解释了为什么它可能是一个坏主意,并提供其他有用的参考。
答案 1 :(得分:0)