私の Linux アプリケーション (A) は、ソース コードを持っていないサード パーティの共有ライブラリ (B) にリンクしています。このライブラリは、(C) のソース コードを持っていない別のサード パーティの共有ライブラリを使用します。(B) は直接リンクする代わりに dlopen を使用して (C) にアクセスしていると思います。これについての私の理由は、(B) の 'ldd' は (C) を表示せず、objdump -X (B) は dlopen/dlclose/dlsym への参照を表示することです。
私の要件は、(A) のコードで、(C) にある関数 foo() への関数ポインターを取得する必要があることです。通常、これには dlsym を使用しますが、dlopen から返されたハンドルを渡す必要がありますが、(B) はこれを公開していないため、持っていません。
-
より大きなコンテキストの場合: (C) の関数を変更して、ヘルパー関数 bar() (これも (C) にあります) を呼び出すたびに、(A) にある同じシグネチャを持つ関数も呼び出すようにする必要があります。同じパラメータ (基本的に、(C) foo()->bar() のコードパスにコードを挿入します。gdb を使用してこれを達成する方法を見つけたと思いますが、gdb コマンド リストを移植するために、 「関数ポインタを取得するステップで立ち往生しています.私はまた、上記の正確な問題ではなく、同じタスクを達成するための代替手段を受け入れています.
編集:これを書いた後、私はおそらくコード内のファイルで別の dlopen を実行できることに気付きました。そのハンドルの dlsym を介して返されるシンボルは、元の dlopen を介して受信したものと同じである必要があります。dlopen のマニュアルページを正しく読んでいる場合. しかし、私はまだ、より大きな文脈でのアドバイスや支援に興味があります.これについてもっと良い方法があれば.