mainとスレッドの前後処理(3)mainとスレッドの前後処理(3)この記事はmainとスレッドの前後処理(2)の続きです。この記事は早くも古いものとなりました。詳細はMinGW+pthread2010.03?を参照。mainとスレッドの前後処理(3)前回までで、やっとプロセスとスレッドの開始時・終了時に処理を割り込ませる方法に見当がついた。理論重視とは言いつつも、結局実装の検証に過ぎない部分も多々あったことは否めないが、とにかくもなんとか納得してコードが書けそうだ。サンプルコードTLSコールバックはプロセス・スレッドの開始・終了を捉えるので、これ一つで事足りる。その為のコードは以下のようなものだ。確認はMinGW猫科研究所パックa004で行った。GCCは4.4.1-tdm-2だ。(DWORD)0};あとは煮るなり焼くなり、好きにすればよい。プロセス開始時・終了時のみスレッド側の処理が不要な場合は、より簡単な方法を取ることができるので、例示しておく。当初の目的が上記のTLS-Callbackで上手く行ってしまったため、あまりしっかりとは検証していないので注意。繰り返しになるが、標準C++の範囲で行う場合。foo;先に書いた通り、グローバル変数のコンストラクタ・デストラクタを利用する。次に、GCCの機能を使用する場合。c_dtors;MinGWは.ctorsと.dtorsを適切にPEのセクションに割り振ってくれるようだ。同じGCCのattribute機能でも、以下のコードは動作しなかった。ignored"と言われる。個人的には、ELFの機能である.ctorsと.dtorsよりも、こちらに対応すべきだと思うのだが。...と書いていたら、別の猫研メンバから一言、「それって変数じゃなく関数のattributeなんじゃない?」と指摘された。{puts("c_dtors!");}で無事通る。「セクション+関数ポインタ」に気を取られすぎてその形式しか頭になかったが、一般的に言えば関数のattributeであるのは当然だ。間違っているのは大抵人間の方だというのを体現してしまった。最後に、以下のように直接セクションに配置するコードも動作しなかった。0;こちらに関しては動作しない理由が全く分からない。何か間違っているのだろうが、詳しく検証してもいない。いずれにしても綺麗な方法ではないので、使うべきではないと思う。今回の件では、かなりのサイトを見て回った。その一部のリンクをここに置いておく。profitELFにおける.ctorsと.dtorsの悪用について。glibcの初期化プロセスを解説。((constructor/destructor))がELFの.ctorsと.dtorsにマップされること等。詳細はgcc-2.95.2/gcc/collect2.cを見よとあるのでこの頃から使用できるらしい。AttributesGCCのマニュアル、関数のattributeに関して。constructor/destructorを見よ。AttributesGCCのマニュアル、変数のattributeに関して。sectionを見よ。Storageに関して。memologue.ctorsのより詳細版、attribute((init_priority(N)))について。オブジェクトファイルについてELFのセクションに関する概説。hacks「MinGWで.CRT$X??とTLSを使うには?」という内容の、ML上での問答。attribute((constructor))とMAGE_TLS_DIRECTORYを使えという結論で簡潔にまとまってる。初期化MSDNの公式な記述。.CRT$XCA/XCZについて触れられている。init_segMSDNの公式な記述。具体的なセクション名との関連については触れられていない模様。Construction同じくMSDNの公式な記述。MAGAZINEの記事。.EXEや.DLLのサイズを減らすという観点だが.CRT$X??セクションに関して触れられている。STL)チームによる.CRT$X??セクションの解説。Centerのフォーラムに投稿された質問と回答。init_segとセクションの対応に触れている。Developer.comWindows(CE?)でのセクションマップについて。一般的なセクションの解説だが.CRT$XCA/XCZ、CRT$XIA/XIZ、CRT$XPA/XPZ、CRT$XTA/XTZが存在するのがわかる。init_segについて。init_segの使い方。「静的オブジェクトの初期化順序制御」を見よ。init_segを使う方法の例にはなる。init_segと.CRT$XCLの関係について。dataという部分で.CRT$X??セクションについて詳説。Drivers.CRT$X??セクションの使用に関して64bit版との整合性のあるサンプル。LoaderTLSの使用例と解説。CallbackPEとTLS-Callbackに関する解説。OllyDbg等を用いて具体的にどういう事かを詳説している。PEの構造を見るためのStudPEというツールが紹介されている。FunctionsTLS-Callbackがマルウェアにどのように利用されているか、という解説。Sarmejeanne(フランス語)IMAGE_TLS_DIRECTORYのバイナリイメージでの解説。温め納豆TLSコールバックが「いつ呼ばれるか」を詳細に検証した記事。前提知識ナシで読むには若干辛いが日本語だしわかりやすい。7アンチデバッガとしてTLS-Callbackが使用されている例。2007IMAGE_TLS_DIRECTORY構造体の意味を含む、TLSとTLS-Callbackの解説。Callbackに関して。VC6からサポートされていたがバグがあるらしい。boostでの使用とTlsAlloc等のAPIに関しても言及。(新)APIから知るWindowsの仕組み:ITproスレッドとTLSの解説。本質を外してる気はするが日本語であるし読みやすい。目次MicrosoftのCOFFフォーマットの解説の日本語訳、.tlsセクションの記述あり。Graphicsの隠し設定を利用した開発テクニック(2/4):CodeZineCRTとマルチスレッドに関するコラムが本件と関連している。このほか、boostのMLで非常に多くの議論が交わされていて読みきれないほど。Boost.Thread」で検索すればすぐ見つかる。コードの例示がなされてる。init_seg等の解説がなされている。logpthreads-w32のstatic版で特別な関数の呼び出しが不要(autostatic)なバージョン。お気に入りの動画を携帯で見ようffmpegのバイナリを配布しているサイト。上記autostaticを利用している例。HACKSの資料らしきもの。スライドなので解説テキストはない。illustrations一般的なセクションに関する説明。ELFが主なターゲットだが他の理解にも役立つ。C++のリンカオプションである/SECTIONの説明。セクションの属性(Read/Write/Execute等)についての説明なので今回の件とは若干離れる。Executable)形式のヘッダに関する情報。今回の件とはかけ離れるが。SpecificationPE/COFFフォーマットに関するMicrosoft謹製の仕様。この他、マイクロソフトのサイトにVCの標準ライブラリのソースらしきものがあった。EULAの関係で見ない方が良さそうなのでここでは表示しない。今回の記事でもその内容に触れない範囲にしているし、MinGWでTLSコールバックさえ扱えれば必要ないだろう。この記事はmainとスレッドの前後処理(2)の続きです。Perl5.010001。