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も同じ?