我正在编译一个应该被 LD_PRELOAD
编辑到其他应用程序中的共享对象 (.so)。我正在使用 -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_PRELOADed 到 c++ 应用程序中时,这些符号将覆盖应用程序符号,导致意外行为。
那么如何让 gcc 静态链接到 libstdc++ 而不公开所有这些符号?
最佳答案
你可以使用 visibility pragmas和 visibility function attributes .
您可能希望提供hidden
或protected
可见性。
我不确定您静态链接 libstdc++
是否正确:您生成的 mylib.so
可能包含非 position independent code .另请阅读 this answer这解释了为什么它可能不是一个好主意,并提供了其他有用的引用。
关于Linux g++ : linking with static libstdc++ without exporting it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17943648/