我正在编译一个共享对象(.so),该对象应该被LD_PRELOAD编码到其他应用程序中。我使用-static-libgcc -static-libstdc++与libstdc++和libgcc静态链接,以避免碎片对象冲突。
但是,这样做会使我将libstdc++中的所有内容公开为公共(public)符号。当我做

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_PRELOAD加载到c++应用程序中时,这些符号将覆盖应用程序符号,从而导致意外的行为。

那么,如何在不公开公开所有这些符号的情况下使gcc静态链接到libstdc++?

最佳答案

您可以使用visibility pragmasvisibility function attributes

您可能想赋予hiddenprotected可见性。

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

关于linux - Linux G++ : linking with static libstdc++ without exporting it,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17943648/

10-13 05:44