えーと、その後なのですが crtbegin.o/crtend.o ってのはどうなんだろと思い
ソースの crtstuff.c と nm の結果からとりあえず
___do_frame_init あたりをリンク時にラップすればいいやと思ったのですが
うまくいきません。
ソースに
extern "C"{ void __wrap___do_frame_init(void); }
ビルド時に -Wl,--wrap,__do_frame_init
でいけるかなと思ったんですが、ダメで、実行ファイル内に
__wrap___do_frame_init がそのままの名前(当然先頭にもう一個_はついてるでしょうけど)で残っちゃってる状態でした。
で、malloc とかはオブジェクトファイルに定義しておくとライブラリの方じゃなくて
オブジェクトファイルに入っている方使ってくれるみたいなので、同じようにすれば大丈夫かな?と思ってやってみたら
やっぱり多重定義でリンクできませんでした(オブジェクトファイル同士なのだから当然…でしょうね)。
こんな感じでどうしたらいいのかまたわからなくなってしまいました。

というか、基本に返ってもう一度質問しなおします。
GCC で malloc/free を独自の実装に置き換える場合に
初期化処理と終了処理を行うにはどうしたらいいのでしょう?
よろしくお願いします。