luaでdllをdynamic linkする場合の注意

luaのmoduleをCで作ってdllにして、requireしたらsetgmentation faultで落ちたのでそのときの覚書。

luaのloadlib.c内でdllのluaopen_modulenameのprocedureアドレスを取り出したとき、それはlua_CFunctionとして扱われてます。

lua_CFunctionの定義は以下

typedef int (*lua_CFunction) (lua_State *L);

ということで__stdcallが無いので、これはCの呼び出し規約。

module側では、いつもの癖でint __stdcall luaopen_modulename(lua_State *L)としてしまったのが敗因。

当たり前ですが __cdeclでないとstackがずれて落ちます、、、。

あと敗因がもう一つ。通常__stdcallはmingwでも funcname@n、msvcでも _funcname@n という形で戻るときに引数の分stackを破棄することを@nで伝えてますが、–add-stdcall-aliasをしてしまっていたのでfuncnameでもlink出来るようにdllを作っちゃってた。

–add-stdcall-aliasは悪な気がする、、、。–kill-atも同じ?