Wine 葡萄酒罐';t加载自定义内置dll并报告“;调用未实现的函数“;
我无法登录WINEHQ Bugzilla,因此我在这里询问,这是要求:Wine 葡萄酒罐';t加载自定义内置dll并报告“;调用未实现的函数“;,wine,Wine,我无法登录WINEHQ Bugzilla,因此我在这里询问,这是要求: 我们有一个windows应用程序,我们有exe源代码,它使用ATL。exe所依赖的DLL需要一些特殊的设备,但大多数都是linux版本。现在我们需要将windows应用程序移植到linux。 我最后一次尝试:编写一个中间dll来封装一些已经跨平台的库,exe将调用新的中间dll,我将中间dll命名为“WINE自定义内置dll”。自定义意味着我编译这个dll.so由winemaker独立完成。在linux shell中的命令行
我们有一个windows应用程序,我们有exe源代码,它使用ATL。exe所依赖的DLL需要一些特殊的设备,但大多数都是linux版本。现在我们需要将windows应用程序移植到linux。
我最后一次尝试:编写一个中间dll来封装一些已经跨平台的库,exe将调用新的中间dll,我将中间dll命名为“WINE自定义内置dll”。自定义意味着我编译这个dll.so由winemaker独立完成。在linux shell中的命令行wine64下运行之前,一切正常:
wine64 portsome.exe
以下是输出:
wine: Call from 0x7bc5eeec to unimplemented function wrapsome.dll.wrap_SOME_GetVersion, aborting
Backtrace:
=>0 0x000000007bc5eeec stub_entry_point+0x5c(dll=<is not available>, name=<is not available>, ret_addr=<is not available>) [/home/root0/src/wine/build/dlls/ntdll/../../../src/dlls/ntdll/loader.c:215] in ntdll (0x000000000023fbc0)
1 0x0000000140001022 in portsome (+0x1021) (0x000000000023fbc0)
2 0x00000001400012e2 in portsome (+0x12e1) (0x000000000023fd70)
3 0x000000007b47d02f start_process+0xbe(entry=0x140001418)
Modules:
Module Address Debug info Name (23 modules)
ELF 7b400000- 7b81a000 Dwarf kernel32<elf>
\-PE 7b420000- 7b81a000 \ kernel32
ELF 7bc00000- 7bd21000 Dwarf ntdll<elf>
\-PE 7bc20000- 7bd21000 \ ntdll
ELF 7c000000- 7c004000 Deferred <wine-loader>
PE 140000000- 140007000 Export portsome
ELF 7fbfe53b4000- 7fbfe56c6000 Deferred msvcr100<elf>
\-PE 7fbfe53e0000- 7fbfe56c6000 \ msvcr100
ELF 7fbfe5b48000- 7fbfe5f1d000 Deferred libhwaware.so
ELF 7fbfe5f1d000- 7fbfe6131000 Deferred wrapsome<elf>
\-PE 7fbfe5f20000- 7fbfe6131000 \ wrapsome
ELF 7fbfe66bc000- 7fbfe68ce000 Deferred libnss_files.so.2
ELF 7fbfe68ce000- 7fbfe6ada000 Deferred libnss_nis.so.2
ELF 7fbfe6ada000- 7fbfe6cf3000 Deferred libnsl.so.1
ELF 7fbfe6cf3000- 7fbfe6efc000 Deferred libnss_compat.so.2
ELF 7fbfe70fc000- 7fbfe7312000 Deferred libgcc_s.so.1
ELF 7fbfe7312000- 7fbfe761b000 Deferred libm.so.6
ELF 7fbfe761e000- 7fbfe7822000 Deferred libdl.so.2
ELF 7fbfe7822000- 7fbfe7bec000 Deferred libc.so.6
ELF 7fbfe7bed000- 7fbfe7e0a000 Deferred libpthread.so.0
ELF 7fbfe7e22000- 7fbfe81c8000 Dwarf libwine.so.1
ELF 7fbfe81ca000- 7fbfe83f2000 Deferred ld-linux-x86-64.so.2
ELF 7ffd8bbe1000- 7ffd8bbe2000 Deferred [vdso].so
然后我得到了“Makefile”文件,并将-fPIC附加到LDFLAGS中。5.继续运行“make”,是的,我得到了wrapsome.dll.so,并将其复制到wine build in dll目录中。 6.最后,我未能运行“wine64 portsome.exe”,问题如上所述。
wine报告“未实现的函数wrapsome.dll.wrap_SOME_GetVersion”,我甚至用
nm wrapsome.dll.so
进行了确认,下面是它的输出:
0000000000213291 B __bss_start
0000000000213298 b call_fini.9485
0000000000213294 b completed.7585
w __cxa_finalize
00000000000118b0 t deregister_tm_clones
0000000000011a20 t DisableThreadLibraryCalls
0000000000011bf0 t DllMain
0000000000011940 t __do_global_dtors_aux
0000000000212de8 t __do_global_dtors_aux_fini_array_entry
0000000000213040 d __dso_handle
0000000000212df8 d _DYNAMIC
0000000000213291 D _edata
00000000002132a0 B _end
0000000000011c88 t _fini
0000000000011980 t frame_dummy
0000000000212de0 t __frame_dummy_init_array_entry
0000000000011ec8 r __FRAME_END__
0000000000213000 d _GLOBAL_OFFSET_TABLE_
w __gmon_start__
0000000000011cb8 r __GNU_EH_FRAME_HDR
0000000000000810 t _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
0000000000212df0 d __JCR_END__
0000000000212df0 d __JCR_LIST__
w _Jv_RegisterClasses
00000000000118f0 t register_tm_clones
U SOME_GetVersion
U SOME_InitAwareSDK
U SOME_UninitAwareSDK
0000000000213298 d __TMC_END__
U __wine_dll_register@@WINE_1.0
U __wine_main_argc@@WINE_1.0
U __wine_main_argv@@WINE_1.0
0000000000011ad0 t __wine_spec_dll_entry
0000000000011c94 r __wine_spec_file_name
0000000000011a20 t __wine_spec_import_thunks
0000000000011c20 t __wine_spec_init
0000000000011c40 t __wine_spec_init_ctor
000000000021329c b __wine_spec_init_state
0000000000213048 d __wine_spec_nt_header
000000000000082a t __wine_spec_pe_header
00000000000119b0 t __wine_spec_relay_entry_points
0000000000011ab9 T wrap_SOME_GetVersion
0000000000011a3c T wrap_SOME_InitAwareSDK
0000000000011a53 T wrap_SOME_UninitAwareSDK
0000000000011a26 T _Z7DllMainP11HINSTANCE__jPv
注意:我已经用一些普通的词驳斥了一些词,因为它不利于向公众展示
我甚至在github中阅读了wine的源代码,似乎exports=RtlImageDirectoryEntryToData(imp\u mod,TRUE,IMAGE\u DIRECTORY\u ENTRY\u EXPORT,&exp\u size)代码>
无法导出winemaker+WineCC工具链编译的warpsome.dll.so文件符号表。我将wrapsome.spec文件更改为以下内容:
@ stdcall wrap_SOME_InitAwareSDK(ptr) wrap_SOME_InitAwareSDK
@ stdcall wrap_SOME_UninitAwareSDK(ptr) wrap_SOME_UninitAwareSDK
@ stdcall wrap_SOME_GetVersion() wrap_SOME_GetVersion
再做一次,然后cp到wine DLL目录,就行了!我知道在windows中没有必要将exe链接更改为warp dll,只需构建一个dll。因此,使用exe所需的相同导出名称,它也应该可以工作。我以后会试试。我试过了,还可以,只要记住在windows中使用小写文件名,即使它是大写的。你能留下你的qq吗。我也有同样的问题,谢谢。
@ stdcall wrap_SOME_InitAwareSDK(ptr) wrap_SOME_InitAwareSDK
@ stdcall wrap_SOME_UninitAwareSDK(ptr) wrap_SOME_UninitAwareSDK
@ stdcall wrap_SOME_GetVersion() wrap_SOME_GetVersion