2

C++ ライブラリを作成しようとしていますが、ロード時に関数を呼び出して初期化する必要があります。GCCを使っているので使ってみたところ、__attribute__((constructor))実際にロード時に関数が呼び出されます。

しかし、前述の関数は異なる翻訳単位にある静的オブジェクトを使用するため、これらの翻訳単位の静的オブジェクトを使用する必要があるときに初期化されるかどうかは不明です。したがって、たとえば、この関数内で std::cout を使用したい場合、骨が折れます。

次のコード スニペットは、この問題をよく示しています。

#include <iostream>

void __attribute__((constructor)) init()
{
    std::cout << "Test\n";
}

int main(int argc, char* argv[])
{
    return 0;
}

ここでは、ロード時に関数 init() が呼び出されますが、現時点で std::cout が初期化されているかどうかは不明であり、5 行目を実行しようとするとエラーが発生する可能性があります。

私の質問は、ロード時に呼び出す必要がある初期化関数が、すべての静的オブジェクトが構築された後に実行されるようにすることは可能ですか?

編集:特定の呼び出しを傍受するために、LD_PRELOAD環境変数を使用して別のプログラム内でプリロードすることにより、このライブラリが使用されることを忘れていたため、ユーザーにmain()内でlib_init()関数を呼び出すように依頼することはできません。

4

1 に答える 1