Вызов импортированных функций приводит к xor eax, eax ret

я построил Google«s УГОЛ библиотека (32 бита, исправлена ​​с помощью это патчи) с использованием MinGW-w64 из msys2 в Windows 7 (64bit). А именно статическая версия с образцами. Похоже, по умолчанию УГОЛ использует напрямую OpenGL по умолчанию (заголовок <gl31.h>).

Когда я запускаю образец (скажем, hello_triangle.exe) создает черное окно, тогда ничего не происходит.

Я попытался пошагово отладить образец с помощью разборки и обнаружил, что каждый вызов OpenGLфункция (glViewport, glClearColor, glClear и т. д.) в конечном итоге приводит к выполнению резервного кода-заглушки.

Скажем, зов glClearColor(1.0f, 0.0f, 0.0f, 1.0f); выглядит как ниже:

fld1
fstps  0xc(%esp)
fldz
fstps  0x8(%esp)
fldz
fstps  0x4(%esp)
fld1
fstps  (%esp)
mov    0x40d398,%eax
call   *%eax
sub    $0x10,%esp // !

На call *%eax строка переходит к следующему коду:

mov    %fs:0x18,%edx
cmpl   $0x40,0x5214102c
jae    0x520a20e9 <glClearColor+32>
mov    %edx,%eax
add    0x5214100c,%edx
mov    (%edx),%edx
jmp    *0x338(%edx)

Окончательный безусловный переход выполняет следующий код:

xor %eax, %eax
ret $0x10

Который, в свою очередь, возвращается к строке, помеченной // ! выше.

Первый условный переход пропускается из-за того, что условие не соответствует (почему?) И выполняет фиктивный резервный код.

Я построил образец следующим образом (генерируется Qt Creator«s qbs проект):

C:\msys64\mingw32\bin\i686-w64-mingw32-g++.exe -m32 -g -O0 -w -pipe -fexceptions -MMD -MF -msse2 ^
"--param=ssp-buffer-size=4" -ggdb "-Wp,-D_FORTIFY_SOURCE=2" -DUNICODE -D_UNICODE -DANGLE_WINDOWS_XP_SUPPORT ^
-D_USE_MATH_DEFINES -DANGLE_STANDALONE_BUILD -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES -DNDEBUG ^
-IC:/Users/User/Downloads/angle/PKGBUILDs/angleproject/mingw-w64/src/angleproject/src ^
-IC:/Users/User/Downloads/angle/PKGBUILDs/angleproject/mingw-w64/src/angleproject/src/common/third_party/numerics ^
-IC:/Users/User/Downloads/angle/PKGBUILDs/angleproject/mingw-w64/src/angleproject/sysinclude ^
-IC:/Users/User/Downloads/angle/PKGBUILDs/angleproject/mingw-w64/src/angleproject/include ^
-IC:/Users/User/Downloads/angle/PKGBUILDs/angleproject/mingw-w64/src/angleproject/samples/sample_util ^
-IC:/Users/User/Downloads/angle/PKGBUILDs/angleproject/mingw-w64/src/angleproject/util ^
"-std=c++0x" ^
-o C:/Users/User/Downloads/angle/angle/build-angle-Desktop-Debug/qtc_Desktop__6e009929-debug/hello-triangle.qtc-Desktop--6e009929.6d1cc0e4/.obj/9ff4caaf6aae2e40/HelloTriangle.cpp.o ^
-c C:/Users/User/Downloads/angle/PKGBUILDs/angleproject/mingw-w64/src/angleproject/samples/hello_triangle/HelloTriangle.cpp
C:\msys64\mingw32\bin\i686-w64-mingw32-g++.exe ^
"-Wl,--unresolved-symbols=ignore-in-shared-libs" ^
"-Wl,-subsystem,console" ^
-LC:/Users/User/Downloads/angle/PKGBUILDs/angleproject/mingw-w64/src/angleproject/build-i686-w64-mingw32-shared/out/Release/samples ^
-LC:/Users/User/Downloads/angle/PKGBUILDs/angleproject/mingw-w64/src/angleproject/build-i686-w64-mingw32-shared/out/Release/src ^
-LC:/Users/User/Downloads/angle/PKGBUILDs/angleproject/mingw-w64/src/angleproject/build-i686-w64-mingw32-shared/out/Release/util ^
"-Wl,--stack,10485760" ^
-o C:/Users/User/Downloads/angle/angle/build-angle-Desktop-Debug/qtc_Desktop__6e009929-debug/hello-triangle.qtc-Desktop--6e009929.6d1cc0e4/hello_triangle.exe ^
C:/Users/User/Downloads/angle/angle/build-angle-Desktop-Debug/qtc_Desktop__6e009929-debug/hello-triangle.qtc-Desktop--6e009929.6d1cc0e4/.obj/9ff4caaf6aae2e40/HelloTriangle.cpp.o ^
-lEGL -lGLESv2 -lANGLE ^
-langle_common -langle_image_util -lsample_util -ltranslator -lpreprocessor ^
-luser32 -lkernel32 -lgdi32 -lopengl32 -lglu32 -lglew32 -ld3d9 -ld3d11 -ldxguid ^
-langle_util

Кажется, что есть проблема с opengl32.dll динамическая / статическая загрузка (какая?). Как решить проблему?

Виноват: УГОЛ не использует OpenGL ES прямо на Windows. Это переводит все OpenGL API вызывает DirectX 11 (в моем случае).

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]