Я использую библиотеку 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