Fixes bug 1296 - SDL_SetVideoMode crashes because of unaligned MOVAPS instruction
t.grundner@goto3d.de 2011-09-01 03:59:17 PDT I figured out what is going on. GCC 4.5.2 assumes the stack is 16 byte aligned by default. Therefore there are no AND alignment corrections necessary if we wish to align a stack variable to a 16 byte boundary. That is bad if your OS ABI is not 16 byte aligned. Windows 32 bit stacks are 4 byte aligned. This results in the above mentioned SIGSEGV. This is also no problem if I compile both SDL.dll and my app with MingW because MinGW/GCC inserts a andl $-16, %esp instruction right in the beginning of the main function. So at least the stack of the thread calling the main function is 16 byte aligned. But as soon as I start to use the SDL.dll from an application not compiled by MinGW there is no ANDL safing my app. However there is a GCC option that can change the default stack alignment: -mpreferred-stack-boundary=num Setting num=2 assumes a the stack is aligned to a 4 byte boundary. This results in GCC inserting the necessary andl $-16, %esp into SDL_FillRect. Rebuilding SDL with ./configure "CFLAGS=-mpreferred-stack-boundary=2 -g -O3" solved the problem. IMHO this should also be a problem on Solaris. The following links contain further information: http://gcc.gnu.org/onlinedocs/gcc-4.5.2/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options http://www.agner.org/optimize/calling_conventions.pdf
Showing
Please register or sign in to comment