abi — C ++ соглашения о вызовах — конвертирование между win32 и Linux / GCC?

Я по колено в проекте по подключению приложений Windows OpenVR, работающих в Wine, непосредственно к встроенному в SteamVR Linux через оболочку Winelib, идея состоит в том, чтобы обойти все проблемы, пытаясь сделать так, чтобы эффективный драйвер устройства работал внутри самого Wine. , Я почти сразу же ударил стену. Кажется, что проблема связана с соглашениями о вызовах, хотя у меня были проблемы с получением значимой информации из winedbg, так что есть шанс, что я далеко.

OpenVR API — это C ++ и состоит в основном из классов, заполненных виртуальными методами. Приложение вызывает метод получения (VR_GetGenericInterface) для получения объекта производного класса, реализующего эти методы из среды выполнения (с закрытым исходным кодом). Затем он вызывает эти методы непосредственно для данного ему объекта.

Моя текущая попытка выглядит следующим образом: Мой обернутый VR_GetGenericInterface возвращает пользовательский класс-обертку для запрошенного интерфейса. Методы этого класса определены в их собственном файле, отдельно скомпилированном с -mabi = ms. Он вызывает методы, не являющиеся членами, в отдельном файле, который скомпилирован без -mabi = ms, что в итоге делает соответствующий вызов в реальном времени выполнения.

Кажется, это работает, пока приложение не вызовет метод, который возвращает структуру некоторого описания. Тогда в приложении произошла ошибка по линии вызова, видимо просто после возврата вызова, поскольку мой код не находится в стеке в тот момент, и я с помощью printfs проверил, что мой упакованный класс достигает точки возврата в приложение.

Это заставляет меня думать, что есть еще одно соглашение о вызовах, которое я еще не учел, касающееся структур и подобных сложных типов. Похоже, что возвращение структуры является одной из наиболее плохо определенных вещей в ABI, но я не нашел конкретных ответов или описаний различий.

Что наиболее вероятно происходит, и как я могу копать глубже, чтобы увидеть, что именно ожидает приложение?

2

Решение

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

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

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

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