Hello all,
I'm trying to integrate my program into Wine source and having some difficulties with doing OpenGL calls. Namely, when I compile the program with mingw and with winegcc, it works flawlessly. But when I integrate it into Wine source tree (taking regedit as an example), stack appears smashed after OpenGL calls.
Here's what my command line looks like with winegcc (written by me manually):
# compilation winegcc -c wgl.c -o wgl.o -g -m32 -municode -DUNICODE -D_UNICODE -g # linking winegcc main.o wgl.o d3d8.o d3d9.o texture.o common.o demo-res.o -lopengl32 -ld3d8 -ld3d9 -ld3dx9 -lgdi32 -lgdiplus -lglu32 -lole32 -lshell32 -lmsvcrt -o 3d-demo.exe -g -m32 -municode
And the function where the crash happens looks like:
00012839 <initLightAndMaterial>: 12839: 55 push ebp 1283a: 89 e5 mov ebp,esp 1283c: 53 push ebx 1283d: 83 ec 24 sub esp,0x24 12840: e8 02 f1 ff ff call 11947 <__i686.get_pc_thunk.bx> 12845: 81 c3 17 5f 00 00 add ebx,0x5f17 1284b: b8 00 00 00 00 mov eax,0x0 12850: 89 45 e8 mov DWORD PTR [ebp-0x18],eax 12853: b8 00 00 00 00 mov eax,0x0 12858: 89 45 ec mov DWORD PTR [ebp-0x14],eax 1285b: b8 00 00 00 00 mov eax,0x0 12860: 89 45 f0 mov DWORD PTR [ebp-0x10],eax 12863: b8 00 00 80 3f mov eax,0x3f800000 12868: 89 45 f4 mov DWORD PTR [ebp-0xc],eax 1286b: 8d 45 e8 lea eax,[ebp-0x18] 1286e: 89 44 24 04 mov DWORD PTR [esp+0x4],eax 12872: c7 04 24 53 0b 00 00 mov DWORD PTR [esp],0xb53 12879: e8 92 f1 ff ff call 11a10 <glLightModelfv> 1287e: 83 ec 08 sub esp,0x8 12881: 8b 5d fc mov ebx,DWORD PTR [ebp-0x4] 12884: c9 leave 12885: c3 ret
And here's the command from Wine tree (generated by its build system):
# compilation /usr/lib/ccache/gcc-4.5 -c -o wgl.o wgl.c -I. -I../../include -I../../include/msvcrt -D__WINESRC__ -D_REENTRANT -fPIC \ -fno-builtin -Wall -pipe -fno-strict-aliasing -Wdeclaration-after-statement -Wempty-body \ -Wignored-qualifiers -Wstrict-prototypes -Wtype-limits -Wvla -Wwrite-strings -Wpointer-arith \ -Wlogical-op -gdwarf-2 -gstrict-dwarf -fno-omit-frame-pointer -g # linking ../../tools/winegcc/winegcc -o 3d-demo.exe.so -B../../tools/winebuild -fasynchronous-unwind-tables -mwindows \ -municode -mno-cygwin d3d8.o d3d9.o wgl.o main.o common.o texture.o demo.res -luser32 -lgdi32 \ -lgdiplus -lopengl32 -lglu32 -ld3d8 -ld3d9 -ld3dx9 -lole32 -lshell32 -lmsvcrt \ ../../libs/port/libwine_port.a
And the resulting function looks like
00014f8e <initLightAndMaterial>: 14f8e: 55 push ebp 14f8f: 89 e5 mov ebp,esp 14f91: 53 push ebx 14f92: 83 ec 24 sub esp,0x24 14f95: e8 8d c9 ff ff call 11927 <__i686.get_pc_thunk.bx> 14f9a: 81 c3 be 42 00 00 add ebx,0x42be 14fa0: b8 00 00 00 00 mov eax,0x0 14fa5: 89 45 e8 mov DWORD PTR [ebp-0x18],eax 14fa8: b8 00 00 00 00 mov eax,0x0 14fad: 89 45 ec mov DWORD PTR [ebp-0x14],eax 14fb0: b8 00 00 00 00 mov eax,0x0 14fb5: 89 45 f0 mov DWORD PTR [ebp-0x10],eax 14fb8: b8 00 00 80 3f mov eax,0x3f800000 14fbd: 89 45 f4 mov DWORD PTR [ebp-0xc],eax 14fc0: 8d 45 e8 lea eax,[ebp-0x18] 14fc3: 89 44 24 04 mov DWORD PTR [esp+0x4],eax 14fc7: c7 04 24 53 0b 00 00 mov DWORD PTR [esp],0xb53 14fce: e8 9d cb ff ff call 11b70 <glLightModelfv> 14fd3: 83 c4 24 add esp,0x24 14fd6: 5b pop ebx 14fd7: 5d pop ebp 14fd8: c3 ret
The C code for the function looked like
static void initLightAndMaterial(void) { const GLfloat globalAmbient[4]={0,0,0,1}; glLightModelfv(GL_LIGHT_MODEL_AMBIENT,globalAmbient); }
And this is my Makefile.in (the function is defined in wgl.c): #--------------------------------------------- MODULE = 3d-demo.exe APPMODE = -mwindows -municode -mno-cygwin IMPORTS = user32 gdi32 gdiplus opengl32 glu32 d3d8 d3d9 d3dx9 ole32 shell32 msvcrt
C_SRCS = \ d3d8.c \ d3d9.c \ wgl.c \ main.c \ common.c \ texture.c
RC_SRCS = demo.rc
INSTALL_LIB = 3d-demo.exe 3d-demo #---------------------------------------
Apparently in-tree compilation assumes another calling convention for glLightModelfv here... What could be the reason for this? How should I set up my Makefile.in so that it generated a result compatible with opengl32 calling convention?
Thanks, Ruslan