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
これが c++ アプリケーションに LD_PRELOAD されると、これらのシンボルがアプリケーションのシンボルをオーバーライドし、予期しない動作を引き起こすため、これは悪いことです。
では、これらのシンボルをすべて公開することなく、gcc を libstdc++ に静的にリンクするにはどうすればよいでしょうか。