gccでnewとdeleteをオーバーライド

困ったなぁ、Carbonのプログラムで自作メモリマネジャーがうまく動かない。Carbonフレームワークからnewとか呼び出されたが、たまにデフォルトのnewを実行されたりして、しかもdeleteの時に、デフォルトのdeleteじゃなくて、オーバーライドされたdeleteを実行されちゃった。やっぱり、gcc 4.xのせいだね、オーバーライドされたnew/deleteのシンボルがすべてパブリックになっちゃった。
XCodeで、unexported symbol fileを使って、オーバーライドされたnew/deleteを隠したが、zero linkがうまく動かなかった。いろいろ調べた結果、always_inlineと言う関数の属性で隠せるようになった。コードはこんな感じ…newとdeleteも同じ。

inline void* operator new(size_t size) __attribute__ ( (always_inline) );
inline void* operator new(size_t size)
{
  return memAlloc(size); // 自分のメモリ確保関数。
}

inline void operator delete(void* addr) __attribute__ ( (always_inline) );
inline void operator delete(void* addr)
{
  memFree(addr); // 自分のメモリ解放関数。
}