3

実行可能ファイルexecutable.exeと一緒にリンクしている2つのサードパーティライブラリA.soとB.soがあります。A.soには、B.soによって対処されるバグが含まれています。つまり、次のようになります。

  • A::subroutine1()呼び出されたときに浮動小数点例外でクラッシュする可能性があります(FP演算バグ)
  • B::subroutine1()は固定実装であり、の代わりに常に呼び出す必要がありA::subroutine1()ます。

AとBの正しいリンク順序は何ですか?私が今していることは:

ifort <....> executable.exe <...> -lA -lB

私はまだ時々浮動小数点例外を受け取ります(エラーは正確に再現できないので、デバッグするのはかなり難しいです)。ただし、クラッシュすると、プログラムはA :: subroutine1()が違反者であることを通知します。そのため、何らかの理由で間違ったバージョンのsubroutine1()がリンクされます。

これで最初のスタブとしてリンク順序を反転しますが、executable.exeを検査して実行時に呼び出されるsubroutine1()のバージョンを確認するために使用できるツールはありますか?

ありがとう!

4

1 に答える 1

1

subroutine1から呼び出したい場合libB.so、正しいリンク順序は-lB -lA(Linux およびその他のほとんどの UNIX 共有ライブラリ実装の場合) です。

executable.exe を調べて、実行時に呼び出される subroutine1() のバージョンを確認するために使用できるツールはありますか

いいえ: 通常、その情報は実行可能ファイルに記録されません。subroutine1ルールは次のとおりです。最初に定義された共有ライブラリが使用されます。

たとえば、 とリンクし-lC -lB -lA、リンク時に が を定義libC.soしていないsubroutine1が、後でlibC.so(実行可能ファイルを再リンクせずに)subroutine1再構築すると、 fromlibC.soが呼び出されます。

ただし、合併症があることに注意してください。たとえば、libA.soとリンクすると、 from withinへ-Bsymbolicのすべての呼び出しがそれ自体にバインドされます。subroutine1libA.sosubroutine1libA.so

于 2011-10-12T07:11:58.287 に答える