我正在编译一个共享对象(.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 pragmas和visibility function attributes。
您可能想赋予hidden
或protected
可见性。
我不确定您是否正确地静态链接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/