So as I thought GCC is taking advantage of #ifdef _MSC_VER __declspec(align(16)) #endif struct cdata { const struct ctype type #ifdef __GNUC__ __attribute__ ((aligned(16))) #endif ; }; when loading from cd->type but cd = (struct cdata*) lua_touserdata(L, idx); lua_touserdata doesn't honor that alignment. You can probably see that at the point of the crash %eax is not aligned to 16 bytes.