共有ライブラリから重複した関数名をロードするためにlibtoolを使用しました

StackOverflow https://stackoverflow.com/questions/1716472

  •  19-09-2019
  •  | 
  •  

質問

私は「デバッグ」を作成しようとしている共有ライブラリこの場合、デバッグライブラリと同じCのAPIを(持っている別の「本当の」共有ライブラリを呼び出します(つまり、.soのまたは.dllファイル)、エミュレートしますPKCS#11 API)。しかし、私は、デバッグライブラリのリンクマップは、実際のライブラリーのそれと衝突し、実際のライブラリーに独自の機能の代わりに、対応する機能を呼び出すためのデバッグライブラリを引き起こしているところトラブルに実行していますよ。私は、POSIX dlmopenコマンドを使用して、この問題の解決策を見つけましたが、同じことがGNUのlibtoolのを使用して可能であれば理解したいと思います。

テストアプリケーションを静的にデバッグライブラリにリンクする場合、

私のSolaris 10システムでは、次のコードはアサーションを失敗します:

#include <dlfcn.h>
int MyFunctionName() {
  int (*function_ptr)();
  void *handle = dlopen("realsharedlibrary.so", RTDL_LAZY);
  *(void **)(&function_ptr) = dlsym(handle, "MyFunctionName");
  ASSERT(function_ptr != MyFunctionName); // Fails
  return (*function_ptr)();
}

この場合、私は本当の共有ライブラリ内の代わりにMyFunctionNameの(デバッグライブラリでの)ローカル「MyFunctionName」への関数ポインタを取得します。

私は、それが代わりに「にdlopen」の「dlmopen」コマンドを使用して、実際のライブラリをロードするとき(LM_ID_NEWLMパラメータを使用して)新しいリンク・マップを作成するために、dlmopen伝えることでこの問題を回避することは可能だということを発見しました。

int MyFunctionName() {
  int (*function_ptr)();
  void *handle = dlmopen(LM_ID_NEWLM, "realsharedlibrary.so", RTDL_LAZY);
  *(void **)(&function_ptr) = dlsym(handle, "MyFunctionName");
  ASSERT(function_ptr != MyFunctionName); // succeeds
  return function_ptr(); // call real function
}

残念ながら、dlmopenは(つまり、私はlibtoolの中lt_dlmopen機能が表示されていない)のlibtool内に含まれていないようです。

それは、libtoolコマンドを使用して同じことを行うことは可能です - ?つまり、新しいライブラリをロードするとき、それはデバッグライブラリのリンクマップと衝突しないように、新しいリンク・マップを作成するために、

役に立ちましたか?

解決

私はまだこの問題を解決するためにlibtoolを使用するための良い方法を発見していないが、これらのフラグをdlopenを使って、関数「dlmopen」固有のSolaris回避する方法はあります:

void *handle = dlopen("realsharedlibrary.so", RTLD_NOW | RTLD_GROUP | RTLD_LOCAL)

明らかに、シンボルの衝突の問題ではなくRTLD_NOWRTLD_LAZYを用い、RTLD_GROUPを追加することによって解決されます。 POSIXがRTLD_LOCALまたはRTLD_LOCALのいずれかを使用する必要があるためRTLD_GLOBALがあり、または動作は未定義です。 Solarisの場合、動作がRTLD_LOCALするデフォルトにある。

未解決の問題は、しかし、それはは、lt_dlopenするフラグのこれらのタイプを渡すことができますかどうかです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top