• Sam Lantinga's avatar
    Fixes bug 1296 - SDL_SetVideoMode crashes because of unaligned MOVAPS instruction · f5c28b24
    Sam Lantinga authored
    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
    f5c28b24
configure 859 KB