Linux g++ : linking with static libstdc++ without exporting it

标签 linux gcc shared-objects libstdc++

我正在编译一个应该被 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 pragmasvisibility function attributes .

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

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

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

相关文章:

Linux shell :Is it possible to speedup finding files using "find" by using a predefined list of files/folders?

linux - gpinitsystem 未知主机 mdw

c - -no-pie 有什么用?

c - GCC 符号查找错误

c++ - Linux 上共享对象 (.so) 的异常

linux - 有没有办法在特定时间自动提交 git 中的更改

C++ 11 正则表达式未按预期返回组

Android JNI - 如何从共享对象导入函数

c++ - 共享对象在主二进制文件中找不到符号,C++

linux - 戈朗 : fatal error: runtime: out of memory