28

最近、GNU ld のリンカ オプション「-Bsymbolic-functions」を発見しました。

-Bsymbolic
  When creating a shared library, bind references to global symbols to the 
  definition within the shared library, if any. Normally, it is possible 
  for a program linked against a shared library to override the definition 
  within the shared library. 

  This option is only meaningful on ELF platforms which support shared libraries.

-Bsymbolic-functions
  When creating a shared library, bind references to global function symbols 
  to the definition within the shared library, if any.  

  This option is only meaningful on ELF platforms which support shared libraries.

-fvisibility=hiddenこれは、参照された関数を他の共有オブジェクトにエクスポートするのを防ぐ代わりに、その関数へのライブラリ内部の参照が別の共有オブジェクトのエクスポートされた関数にバインドされるのを防ぐという点で、GCC オプションの逆のようです。関数の PLT エントリの作成を防ぐことができると自分-Bsymbolic-functionsに言い聞かせましたが、これは良い副作用です。

  1. -Bsymbolicしかし、ライブラリの個々の関数定義を上書きするなど、これをより細かく制御できるかどうか疑問に思っていました。

  2. を使用する際の落とし穴に注意する必要があり-Bsymbolic-functionsますか? は例外を壊すので、私はそれのみを使用する予定です-Bsymbolic(typeinfoオブジェクトへの参照が統一​​されないようにするだろうと思います)。

ありがとう!

4

4 に答える 4

26

Tumbleweedバッジを獲得したばかりなので、自分の質問に答えます...そして後で知りました

-Bsymbolicしかし、ライブラリの個々の関数定義を上書きするなど、これをより細かく制御できるかどうか疑問に思っていました。

はい、--dynamic-listまさにそれを行うオプションがあります

を使用する際の落とし穴に注意する必要があり-Bsymbolic-functionsますか? -Bsymbolic は例外を壊すので、それのみを使用する予定です (typeinfo オブジェクトへの参照が統一​​されないようにするためだと思います)。

詳しく調べてみましたが、問題ないようです。libstdc++ ライブラリは明らかにそれを行っているか、少なくともそれを考慮しており、統合するために追加--dynamic-list-cpp-newするだけで済みoperator newました (プログラム内で複数のアロケーター/デアロケーターが混同する問題を防ぐためですが、とにかくそのようなプログラムは壊れていると主張します)。Ubuntu はそれを使用しているか、デフォルトで使用しており、一部のパッケージとの競合が発生しているようです。しかし、全体的にはうまくいくはずです。

于 2011-09-03T20:12:41.500 に答える
0

副作用を伴うケースがあります。文書化されたもの: https://bugs.launchpad.net/ubuntu/+source/xfe/+bug/644645 私は今そのようなケースがあるので、それについてもっと理解したいと思います。

于 2013-12-22T12:17:49.487 に答える