0

現在、Linux上の2つのサードパーティ共有ライブラリ(A.soとB.so)とリンクしています。問題は、2つのsoの両方が別のライブラリと静的にリンクされていることです。その結果、A.soとB.soから同じ名前の関数が約400個あります。コンパイルして-lA-lBまたは-lB-lAとリンクすると、問題の原因となった関数の挿入の結果として、関数がAまたはBから個別に取得され、コードが実行できなくなります。関数名をライブラリにバインドして、両方のライブラリをリンクして使用できるようにする方法があるかどうか疑問に思っていますか?これらの重複する関数名はAとBの内部で呼び出されるため、objcopyなどを使用できません。dlopenは役に立ちますか?

4

1 に答える 1

5

関数名をライブラリにバインドして、両方のライブラリをリンクして使用できるようにする方法があるかどうか疑問に思っていますか?

2 つのライブラリがリンクされたとき、エクスポートするシンボルを制御し、「他の」ライブラリを非表示にする必要がありましたが、そうではありませんでした ...

dlopen は役に立ちますか?

はい: あなたdlopen("A.so", RTLD_LOCAL);dlopen("B.so", RTLD_LOCAL);の場合、どちらのライブラリもグローバル スコープに追加されず、お互いを「認識」しません。

と から必要なシンボルを明示的に検索する必要がありますがA.soB.soそれが最善の方法です。

アップデート:

A.soのビルド中にその「他の」ライブラリからシンボルをエクスポートせずに静的ライブラリにリンクする簡単な方法はありますか

これは、-fvisibility=hiddenフラグを使用し__attribute__((visibility("default")))、エクスポートする必要があるシンボルで行うのが最適です。例:

#define EXPORTED __attribute__((visibility("default")))

struct Foo {
  void EXPORTED ExportedFunction();
  void EXPORTED AnotherExportedFunction();
  void InternalFunction();
};

void Foo::ExportedFunction() { }
void Foo::AnotherExportedFunction() { }
void Foo::InternalFunction() { }


gcc -shared -fPIC -o foo.so foo.cc
nm -CD foo.so  | grep Foo::
00000000000005fc T Foo::ExportedFunction()
0000000000000610 T Foo::InternalFunction()
0000000000000606 T Foo::AnotherExportedFunction()

明示的な輸出管理がなければ、すべてが輸出されます (InternalFunction望ましくないものも含まれます)。

gcc -shared -fPIC -o foo.so foo.cc -fvisibility=hidden
nm -CD foo.so  | grep Foo::
00000000000005bc T Foo::ExportedFunction()
00000000000005c6 T Foo::AnotherExportedFunction()

ほら: 明示的にエクスポートしたかったものだけです。

于 2013-02-04T07:04:59.330 に答える