• 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
Name
Last commit
Last update
VisualC Loading commit data...
Xcode Loading commit data...
Xcode-iPhoneOS Loading commit data...
acinclude Loading commit data...
android-project Loading commit data...
build-scripts Loading commit data...
include Loading commit data...
src Loading commit data...
test Loading commit data...
.DISABLED-hgeol Loading commit data...
.hgignore Loading commit data...
.hgtags Loading commit data...
.indent.pro Loading commit data...
Android.mk Loading commit data...
BUGS Loading commit data...
Borland.html Loading commit data...
Borland.zip Loading commit data...
COPYING Loading commit data...
CREDITS Loading commit data...
INSTALL Loading commit data...
Makefile.ds Loading commit data...
Makefile.in Loading commit data...
Makefile.minimal Loading commit data...
Makefile.pandora Loading commit data...
Makefile.wiz Loading commit data...
NOTES Loading commit data...
README Loading commit data...
README-SDL.txt Loading commit data...
README.BeOS Loading commit data...
README.DirectFB Loading commit data...
README.HG Loading commit data...
README.MacOSX Loading commit data...
README.Platforms Loading commit data...
README.Porting Loading commit data...
README.Watcom Loading commit data...
README.WinCE Loading commit data...
README.android Loading commit data...
README.ds Loading commit data...
README.gesture Loading commit data...
README.iphoneos Loading commit data...
README.pandora Loading commit data...
README.touch Loading commit data...
SDL.spec.in Loading commit data...
TODO Loading commit data...
UNDER_CONSTRUCTION.txt Loading commit data...
VisualC.html Loading commit data...
Watcom-Win32.zip Loading commit data...
WhatsNew Loading commit data...
aclocal.m4 Loading commit data...
autogen.sh Loading commit data...
configure Loading commit data...
configure.in Loading commit data...
sdl-config.in Loading commit data...
sdl.m4 Loading commit data...
sdl.pc.in Loading commit data...