2

我正致力于一个项目,通过 Winelib 包装器将在 Wine 中运行的 Windows OpenVR 应用程序直接连接到 Linux 本机 SteamVR,其想法是回避所有问题,试图让一个非常复杂的设备驱动程序在 Wine 本身内部运行. 我几乎立即撞到了墙上。这个问题似乎与调用约定有关,尽管我在从 winedbg 中获取有意义的信息时遇到了麻烦,所以我有可能走得更远。

OpenVR API 是 C++,主要由填充了虚拟方法的类组成。应用程序调用一个 getter (VR_GetGenericInterface) 来从(封闭源)运行时获取实现这些方法的派生类对象。然后它直接在给它的对象上调用这些方法。

我目前的尝试是这样的:我包装的 VR_GetGenericInterface 为请求的接口返回一个自定义包装类。此类的方法在它们自己的文件中定义,分别使用 -mabi=ms 编译。它在没有-mabi=ms 的情况下编译的单独文件中调用非成员方法,最终在实际运行时中进行相应的调用。

这似乎有效,直到应用程序调用一个返回某种描述结构的方法。然后应用程序在调用发生的行上出现段错误,显然在调用返回之后,因为那时我的代码不在堆栈上的任何位置,我用 printfs 验证了我的包装类到达返回到应用程序的点。

这让我想到还有另一个我还没有考虑到的调用约定陷阱,与结构和类似的复杂类型有关。从谷歌搜索看来,返回结构通常是 ABI 中定义更不明确的事情之一,但我没有找到具体的答案或差异描述。

最有可能发生什么,我如何才能更深入地了解应用程序的确切预期?

4

0 回答 0