繁体   English   中英

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

[英]Linux g++: linking with static libstdc++ without exporting it

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

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

您可以使用可见性编译指示可见性功能属性

您可能希望提供hiddenprotected可见性。

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

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

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

声明要导出的符号

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM