3

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++ に静的にリンクするにはどうすればよいでしょうか。

4

2 に答える 2

0

可視性プラグマ可視性関数の属性を使用できます。

あなたはおそらく 可視性hiddenを与えたいと思うでしょう。protected

静的にリンクするのが正しいかどうかはわかりませんlibstdc++。結果として、位置に依存しないコードmylib.soが含まれる可能性があります。なぜそれが悪い考えであるかを説明し、他の有用な参考文献を提供するこの回答も読んでください。

于 2013-07-30T10:55:58.267 に答える
0

私がやったことは、バージョンスクリプトを使用することです:

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

どのシンボルがエクスポートされるかを宣言する

于 2013-08-04T15:40:44.123 に答える