3

共有ライブラリで使用するプログラムがあります。

コードでいっぱいのメソッドでコンパイルされた1つのライブラリ(1)があります。

class A
{
public:
    int* funcA(int a, int b)
    {
        int* pInt = new int;
        *pInt = a + (b * 20);
        return pInt;
    }
};

次に、メソッドに何もない、まったく同じ名前とインターフェイスを持つ別のライブラリ(2) 、つまりダミークラスがあります

class A
{
public:
    int* funcA(int a, int b)
    {
        return 0;
    }
};

(注:私の問題を説明するために使用されたコード)

ライブラリ 1に対してコンパイルし、実行時にライブラリ 1を使用すると、すべてが期待どおりに機能します。

ライブラリ 2に対してコンパイルし、実行時にライブラリ 1を使用すると、最初に呼び出された funcA が停止します。

nm -D libMy.so を使用し、実行時に funcA のオフセットを見ると、違います。これはバイナリに含まれていますか?

私はさまざまなマニュアルやチュートリアルを読みましたが、コンパイルとランタイムの側面がどのようにこの失敗を引き起こすかについては賢明ではありません. メソッドが成功するように、インターフェースは同じだと思っていたでしょう。

ありがとう。

4

3 に答える 3

2

これが失敗する理由は、別のライブラリに対してリンクしているため、(ご覧のとおり) 関数のオフセットが異なるためです。リンカーはオフセットをコンパイル済みバイナリに配置しているため、そのライブラリに対してのみ実行されます。ここで試みていることを達成するには、動的ライブラリの読み込みを使用する必要があります。詳細については、この SO の質問を参照してください。

編集:
もう少し読んで、このPDFに出会いました。役に立つかもしれません。

于 2012-08-30T15:22:42.457 に答える
0

ライブラリのコンパイル中に-fPICオプションを忘れましたか?コンパイルコマンドを追加してください。

于 2012-08-31T05:57:00.543 に答える
0

(あなたの質問の下にコメントするだけの十分な担当者がいません)

これは、100% 確実ではありませんが、プログラムが事前にリンクされている (Linux) または事前にバインドされている (MacOS) ためである可能性があります。それに関するいくつかの基本的な情報は、以下のウィキペディアにあります。マニュアルの検索でこれに遭遇しましたか?

http://en.wikipedia.org/wiki/Prelink

http://en.wikipedia.org/wiki/Prebinding

于 2012-08-30T15:03:38.963 に答える