3

我正在编译一个应该被LD_PRELOAD编辑到其他应用程序中的共享对象 (.so)。我正在使用静态链接 libstdc++ 和 libgcc-static-libgcc -static-libstdc++以避免分片对象冲突。但是,这样做会使我将 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++ 呢?

4

2 回答 2

0

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

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

声明导出了哪些符号

于 2013-08-04T15:40:44.123 回答
0

您可以使用可见性编译指示可见性函数属性

你可能想给予hiddenprotected 知名度。

我不确定静态链接是否正确libstdc++:您的结果mylib.so可能包含非位置无关代码。另请阅读此答案,该答案解释了为什么它可能是一个坏主意,并提供了其他有用的参考。

于 2013-07-30T10:55:58.267 回答