PEの weak シンボルを試す
某スレで教えてもらったのですが、gcc 4.1.1では PEで weak シンボルを扱えるらしいです。
これを利用すれば libc がリンクされているときだけ初期化関数を呼べるのではないか?との見通しも。
まずは簡単な実験を。
gcc
nobita% /home/taro/bin/i586-mingw32-gcc --version i586-mingw32-gcc (GCC) 4.1.1
下準備
gcc 4.1.1を利用するので trunk/mona -> branches/mona-stdio で gcc4対応のコードを merge する
nobita% svn merge https://svn.sourceforge.net/svnroot/monaos/trunk/mona/ \ https://svn.sourceforge.net/svnroot/monaos/branches/mona-stdio/ .
weak.cpp
#include <monapi.h> int weak_func() { syscall_print(__func__); return MONA_SUCCESS; }
main.cpp
__attribute__( (weak) )で weak シンボルとして扱ってねと言っておきます。
extern int weak_func() __attribute__((weak)); int MonaMain(List<char*>* pekoe) { if (weak_func) { weak_func(); } else { printf("weak_func not found\n"); } }
nmでmain.oを見てみる
nmもmingw32用のものを使います。
w マークが付いているので weak シンボルとして扱われています。-Cはdemagleのオプションです。
nobita% /home/taro/bin/i586-mingw32-nm -C main.o |grep 'weak_func()' w weak_func()
実験結果
上記テストコードをMonaで実行したところ weak.o をリンクするかしないかで動作が意図通りかわりました。