Cygwin なんでも掲示板

一覧最新記事過去一覧 | 検索FAQアンテナHOME
(新規投稿・発言はできません)


スレッド

└◇1344:
gcc で作成したプログラムのスタートアップコードに関して [ネモ] 07/17 15:05

 └◇1348:Re:gcc で作成したプログラムのスタートアップコードに関して [nil] 07/23 <


1344● gcc で作成したプログラムのスタートアップコードに関して[ ネモ ] 2003 07/17 15:05
はじめまして。
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 でも流用できそうな方法で!)はないでしょうか?
スレッド一覧


1348● Re:gcc で作成したプログラムのスタートアップコードに関して[ nil ] 2003 07/23 01:02
先日、FAQ 見ないで cygwin-1.3.22-1-src を compile して、はまって
いたのですが(w32api-*-src も必須で別ディレクトリで configure す
る。それだけではおかしくて mingw-*-src も入れて .orig のファイル
も戻した)、

この問題、FAQ の "Can I use my own malloc?" の話はすでに関係無く
なっているのでしょうか? (/usr/doc/cygwin-doc-1.3/txt/faq.txt)

ちょこっと src 見ただけでは、malloc の実体がどこなのか確認し切れ
なく、src をいじらないでエレガントに解決するのは難しそうな印象…
スレッド一覧

早田のホームページへ
CGIROOM