0

組み込みの powerpc で実行される g++ でコンパイルされたマルチスレッドの C++ アプリがあります。継続的インテグレーション テストでこれをメモリ リーク テストするために、 でロードされるヒープ アナライザーを作成しましたld_preload

ld_preloadedモジュール内の関数が他の何かが発生する前に呼び出されることを保証したいと思います (静的オブジェクトの作成などを含む...)。さらに重要なことは、プロセスが終了する直前に呼び出される別の関数を用意して、ヒープ アナライザーがその結果を出力できるようにすることです。ld_preloaded私たちが見ている問題は、モジュールで何かが起こる前に、アプリケーションのベクトルがグローバル ファイル スコープで作成されていることです。ベクトルはメイン内でサイズが大きくなります。シャットダウン時destructorに、ベクターが破棄される前に、プリロードされたモジュールの関数が呼び出されます。

プリロードされたモジュールをコーディングして、他の何よりも前に、他のすべての後に関数を実行する方法はありますか? __attribute__((constructor))andを使用してみましたが、destructor成功しませんでした。

質問のタイトルに戻ると、ld後続のモジュール ロードのシンボルを解決するときに、プリロードされたモジュールのみを検索するのではないかと疑い始めています。実際には、プリロードされたモジュールを最初にロードしません。誰かが私たちのためにこれに光を当てることができますか?

4

1 に答える 1

1

元々、異なる変換単位からのコンストラクターの順序を制御することはできませんでした。したがって、これは共有ライブラリにも適用されます。

ただし、新しいバージョンではGCC、属性に優先度パラメーターを適用することがサポートされていconstructorます。これにより、指定した関数が他のグローバルコンストラクターとの関係でいつ実行されるかをある程度制御できるようになります。指定されていない場合のデフォルトの優先度は、最大優先度値です。したがって、以下に設定した優先度レベルでは、コンストラクターがそれらの前に実行され、デストラクタがそれらの後に実行されます。

static int initialize () __attribute__((constructor(101)));
static int deinitialize () __attribute__((destructor(101)));

static int initialize () {
    puts("initialized");
}

static int deinitialize () {
    puts("deinitialized");
}

101指定できる最低の優先度レベルのようです。65535最高です。小さい番号が最初に実行されます。

于 2012-08-04T00:08:14.873 に答える