3

dlopen()共有オブジェクトの場合、DLLを明示的に呼び出さずに実行するためのメカニズムがありますか?具体的には、呼び出し元のdlopen()が認識できないグローバル/静的なC++静的初期化コードですか?私は答えが "はい"であるべきであると確信していますが、どのような仕組みが起こるのか、どのようにそれを利用して任意のコードを実行するのかを覚えていません。dlopenしたときに、静的初期化(および/または他の)コードが実行されますか?

+1

http://stackoverflow.com/questions/2053029/how-exactly-does-attribute-constructor-work – Brian

+0

@Brian:私はあなたが答えをすることができると思います... GCC?例えばclangまたはicc? – einpoklum

答えて

2

はい:dlopenは、ロード時にコードを実行するためのELFバイナリ形式のメカニズムを使用します。

  • 古い1を呼び出すためにdlopendlcloseのための関数ポインタの配列を含み、特別な.init.finiのセクションを、使用しています。

    は、実際には2つのそのようなメカニズムがあります。セクションは実行時に存在しない可能性があるため、DT_INITDT_FINIという動的タグが対応するセクションを指しています。

  • 新しい機構は.init_array.fini_arrayDT_INIT_ARRAYDT_INIT_ARRAYSZDT_FINI_ARRAYDT_FINI_ARRAYSZダイナミックタグを対応です。

2つのメカニズムの違いは、hereと記載されています。

__attribute__((constructor))でC関数をデコレートすると、コンパイラはオブジェクトがdlopenであるときに実行するために、これら2つのメカニズムのうちの1つを使用します。動的初期化を必要とするグローバルC++オブジェクトの構築コードについても同様です。

関連する問題