簡體   English   中英

葡萄酒規格文件

[英]Wine spec files

我有一個名為morag.dll的Windows DLL, morag.dll包含函數foo和bar。 我還有一個名為morag.so的Linux SO, morag.so包含foo和bar(每個平台上的相同參數)的Linux實現。 我有一個Windows應用程序,該文件加載要在wine下運行的morag.dll 該應用程序本身運行正常,但是我需要創建富和由我的應用程序預計將在被發現巴之間的映射morag.dll改用foo和酒吧中morag.so

為此,我知道我需要創建morag.dll.spec文件並將winebuild到morag.dll.so

按照此處的說明我在morag.c中創建了一個包裝器, morag.c包含ProxyfooProxybar函數,它們只調用真實函數foo和bar。 然后我創建了morag.dll.spec

1 stdcall foo (long ptr) Proxyfoo
2 stdcall bar (ptr ptr)  Proxybar

我編譯了我的C部分,winebuild規格文件,然后使用winegcc將它們鏈接到morag.dll.so

然后,我閱讀了此頁面該頁面建議您可能不需要代理功能,因此我嘗試了完全不使用c部分並因此制作了一個spec文件:-

1 stdcall foo (long ptr)
2 stdcall bar (ptr ptr)

如上所述,執行winebuild步驟和winegcc鏈接步驟。

在這兩種情況下,這些都是我使用的選項。

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

NB [..]表示僅在構建c部分的情況下才使用此功能。

在這兩種情況下,當我在wine下運行的應用程序嘗試使用GetProcAddress加載DLL中的入口點時,都會失敗。

我用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因為LoadLibraryExA已經返回了它的句柄,但是當它試圖在該HMODULE句柄中查找函數foo時,它失敗了。

如果我發出:-

nm -D morag.dll.so

在這兩種情況下,我都看到foo和bar顯示為U。 在也有代理功能的情況下,代理功能顯示為T。

我認為這是因為我沒有使用正確的選項正確構建morag.dll.so文件,或者我的spec文件格式不正確。 我不確定應該使用上述兩種方案中的哪一種。

所有幫助,不勝感激。

我今天遇到了同樣的問題。

在我的案例中,缺少的是內置DLL中例如foobar的正確導出規則。 方便地,除了--dll對象之外, winebuild工具還可以為我們創建一個.def文件,例如:

morag.def: morag.spec
    $(WINEBUILD) --def -E $< -o $@

生成的.def文件必須與其他對象一起鏈接到morag.dll.so中。 這樣就可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM