Linux g ++:与静态libstdc ++链接而不导出它

时间:2013-07-30 09:47:20

标签: linux gcc shared-objects libstdc++

我正在编译一个应该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 ++?

2 个答案:

答案 0 :(得分:0)

您可以使用visibility pragmasvisibility function attributes

您可能希望hiddenprotected可见。

我不确定您是否可以静态链接libstdc++:结果mylib.so可能包含非position independent code。另请阅读this answer,它解释了为什么它可能是一个坏主意,并提供其他有用的参考。

答案 1 :(得分:0)

我最终做的是使用版本脚本:

http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_25.html

声明导出的符号