我有一个名为的 Windows DLLmorag.dll
包含函数 foo 和 bar。我还有一个名为的 Linux SOmorag.so
包含 foo 和 bar 的 Linux 实现(每个平台上的参数相同)。我有一个可以加载的 Windows 应用程序morag.dll
我想在酒下跑步。应用程序本身运行良好,但是我需要创建 foo 和 bar 之间的映射,我的应用程序期望在morag.dll
改为使用 foo 和 barmorag.so
.
为此,我知道我需要创建morag.dll.spec
文件并 winebuild 到morag.dll.so
.
遵循说明here https://www.winehq.org/docs/winelib-guide/bindlls我创建了一个包装器morag.c
包含函数Proxyfoo
and Proxybar
它只是调用实际函数 foo 和 bar 。然后我创建了morag.dll.spec
thus:-
1 stdcall foo (long ptr) Proxyfoo
2 stdcall bar (ptr ptr) Proxybar
我编译了我的c部分,winebuild了spec文件,然后使用winegcc将它们链接到morag.dll.so
然后我读了这一页 https://wiki.winehq.org/Winelib_User%27s_Guide这表明您可能不需要代理功能,所以我尝试完全不使用 c 部分并制作一个规范文件:-
1 stdcall foo (long ptr)
2 stdcall bar (ptr ptr)
如上所述,执行了 winebuild 步骤和 winegcc link 步骤。
在这两种情况下,这些都是我使用的选项。
winebuild --dll -m32 -E ./morag.dll.spec -o morag.dll.o
ldopts= -m32 -fPIC -shared -L/usr/lib/wine -L/opt/morag/lib -lmorag
winegcc $(ldopts) -z muldefs -o morag.dll.so [morag.o] morag.dll.o
注意: [..] 表示我仅在构建 c 部分的情况下使用它。
在这两种情况下,当我在 wine 下运行的应用程序尝试使用以下命令加载 DLL 中的入口点时GetProcAddress
它失败。
我与WINEDEBUG=+module,+relay
并看到尝试和失败记录如下:-
0025:Ret KERNEL32.LoadLibraryExA() retval=7dbc0000 ret=00447b84
0025:Call KERNEL32.GetProcAddress(7dbc0000,00b2d060 "foo") ret=00447c8a
0025:Ret KERNEL32.GetProcAddress() retval=00000000 ret=00447c8a
看来它已经找到并加载了我的morag.dll.so
since LoadLibraryExA
已经返回了它的句柄,但是当它尝试在该 HMODULE 句柄中查找函数 foo 时,它失败了。
如果我发出:-
nm -D morag.dll.so
我看到 foo 和 bar 在两种情况下都显示为 U。在也有代理函数的情况下,代理函数被显示为T。
我认为这是因为我还没有构建morag.dll.so
文件正确,要么选项错误,要么我的规范文件格式不正确。我不确定应该使用上述两种方案中的哪一种。
非常感谢所有帮助。