Замыкания с помощью STDCALL ABI в x86 Windows вызывают исключения переполнения стека с LibFFI 3.2.1

Я использую библиотеку libffi (версия 3.2.1), чтобы включить интерфейс API с языка сценариев, разрешив скрипт для создания прототипов для вызова функций API или определения функций обратного вызова, совместимых с API.

В x64 в Windows используется только одно соглашение о вызовах; WIN64 в libffi. Это отлично работает с замыканиями в библиотеке, и скрипт может легко создавать функции обратного вызова, которые можно использовать в таких вызовах, как EnumChildWindows (HWND, WNDENUMPROC, LPARAM).

Однако на x86 вызов EnumChildWindows с закрытием, созданным LibFFI с помощью STDCALL ABI, вызывает исключение переполнения стека. Согласно сообщениям о проблемах, это связано с неверно выделенными аргументами при вызове функции трамплина. (x86 stdcall (win32) неправильно выравнивает аргументы стека, win32 x86 stdcall closure: неправильно восстановленный стек после вызова закрытия).

Я пробовал применить исправления, упомянутые в этих отчетах о проблемах, однако они, похоже, не решают проблему для моих тестовых случаев. У меня есть еще один тестовый пример, чтобы определить, действительно ли это выравнивание аргументов, путем создания функции обратного вызова без каких-либо аргументов; вызывая его из внешнего двоичного файла. Эта функция STDCALL вызывается правильно, и никаких проблем не возникает, так как выравнивание аргументов не требуется.

В отчаянии я попытался скомпилировать верхнюю версию репозитория libffi с той же цепочкой инструментов, которую я использовал для 3.2.1, однако эта версия жалуется, что целевые объекты Windows x86 не поддерживаются (неправильный синтаксис asm в sysv.S). Мне нужна библиотека для компиляции в MSVC из-за статической привязки CRT к полученной статической библиотеке.

Теперь, в конце концов, мой вопрос для решения состоит из нескольких вариантов

  • Есть ли у кого-нибудь патч для 3.2.1, исправляющий проблему с stdcall на Windows x86
  • Кто-нибудь знает способ компиляции версии подсказки с MSVC для целей x86
  • Может ли кто-нибудь сказать мне, как скомпилировать LibFFI в статическую библиотеку с полностью статически связанными зависимостями (CRT / pthreads, я пробовал с gcc -static ... -static-libgcc -lpthreads -lrt), потому что мои попытки все еще дают `` неразрешенные символы '' относительно т. е. pthread

Я искал решения более недели и предполагаю, что мне не хватает чего-то очевидного, поскольку библиотека используется во многих проектах.

Спасибо,
Bas


person Bas Groothedde    schedule 09.02.2018    source источник


Ответы (1)


В ходе дальнейшего исследования я обнаружил, что в используется вилка libffi. Собственный доступ к Java. Эта версия LibFFI содержит исправление, которое я искал, и закрытие stdcall x86 выполняется успешно. Эта версия LibFFI успешно компилируется с MSVCC.

Это считается первым решением в моем списке возможных вариантов в моем исходном вопросе.

person Bas Groothedde    schedule 12.02.2018