はじめまして。
gcc on cygwin でスタートアップ及び終了処理時に
やりたい事があるのですが、うまい方法が思いつきません。
そもそもは、さる事情から malloc/free を置き換えたいと思い、
malloc/realloc/free を含んだオブジェクトを食わせて
コンパイルしたのですが、
ヒープ管理の終了処理を行う場所がないのです。
(初期化は malloc 中に無理矢理行うようにしたのですが、これも本当は何とかなるなら外部に出したいです。)
malloc 自体は既にスタートアップルーチン中から多用されているようで、かなりはじめに初期化しなければならず、
さらに free も main 終了後、おそらく atexit に登録した関数や、
グローバル系オブジェクトのデストラクタ呼び出し等の後まで
呼び出されるようで、普通に定義した終了処理やオブジェクトのデストラクタでは行えないようなのです。
ですので、スタートアップ開始時と本当にシステムに戻り値を返す直前辺りに
関数を引っ掛けたいと思うのですが、これは
スタートアップコードを自作するしかないのでしょうか?
ちなみに開始時に関しては既に半解決済みで
void entry()
{
AtFirst();
mainCRTStartup();
}
みたいな関数を定義し、ビルド時に
gcc entry.c -o entry.exe -Wl,-e,_entry
としてやる事で AtFirst が呼び出された後に
通常のスタートアップ処理が行われるようにはできました。
(mainCRTStartupがcygwin_crt0を呼び、そこから呼ばれる dll_crt0__FP11per_process はもう処理を返さないらしいので
mainCRTStartup() の後に関数を付け足しても駄目というのも確認しました。)
というわけで、終了処理のみなのですが
何かうまい方法(できれば cygwin でも mingw でも流用できそうな方法で!)はないでしょうか?
|