我正在编译一个应该被LD_PRELOAD
编辑到其他应用程序中的共享对象 (.so)。我正在使用静态链接 libstdc++ 和 libgcc-static-libgcc -static-libstdc++
以避免分片对象冲突。但是,这样做会使我将 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_PRELOADed 到 c++ 应用程序中时,这些符号将覆盖应用程序符号,导致意外行为。
那么如何在不公开所有这些符号的情况下使 gcc 静态链接到 libstdc++ 呢?