我深入研究了一个项目,通过Winelib包装将Wine中运行的Windows OpenVR应用程序直接连接到Linux本机SteamVR,其目的是回避尝试制作实际上非常复杂的设备的所有问题司机在葡萄酒本身内运行。我几乎立即撞墙了。这个问题似乎与调用约定有关,虽然我无法从winedbg中获取有意义的信息,所以我有机会离开。
OpenVR API是C ++,主要由填充虚拟方法的类组成。应用程序调用getter(VR_GetGenericInterface)来从(闭源)运行时获取实现这些方法的派生类对象。然后它直接在给定的对象上调用这些方法。
我当前的尝试是这样的:我的包装VR_GetGenericInterface返回所请求接口的自定义包装类。这个类的方法在它们自己的文件中定义,使用-mabi = ms单独编译。它在一个单独的文件中调用非成员方法,该文件是在没有 -mabi = ms的情况下编译的,最终将相应的调用转换为实际的运行时。
这似乎有效,直到应用程序调用返回某个描述的结构的方法。然后应用程序会在调用发生的行上发生段错误,显然在调用返回后只是,因为我的代码在该点的任何地方都没有,我用printfs验证我的包裹类到达返回应用程序的重点。
这让我想到还有另一个召集会议,我还没有考虑到它,与结构和类似的复杂类型有关。从谷歌搜索它似乎返回一个结构是ABI中通常较不明确的事情之一,但我没有找到具体的答案或差异的描述。
最有可能发生什么,如何深入挖掘应用程序的预期?