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 をリンクするかしないかで動作が意図通りかわりました。