Wine не может загрузить мою пользовательскую встроенную dll и сообщить о вызове нереализованной функции

Я не могу войти в WINEHQ Bugzilla, поэтому я спрашиваю здесь, и это требование:
У нас есть приложение для Windows с исходным кодом exe, и оно использует ATL. Для dll, от которых зависит exe, требуется специальное устройство, но в основном они имеют версию для Linux. Теперь нам нужно перенести приложение Windows на Linux.
Моя последняя попытка: написать промежуточную dll, чтобы обернуть некоторую библиотеку, которая уже является кросс-платформенной, exe вызовет новую промежуточную dll, и я называю промежуточную dll "WINE custom". встроенная dll". CUSTOM означает, что я компилирую эту dll.so отдельно от Winemaker. Все нормально, пока не запускаю под wine64, командная строка в linux shell:

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

Вот мой вопрос:
как мне скомпилировать пользовательскую встроенную dll для вина, чтобы собственное приложение Windows могло вызывать свою функцию во время работы, нужно ли создавать поддельную dll с помощью WineBuilder?

Подробные шаги, которые я работаю над переносом приложения Windows на Linux:
1. Найдите специальную dll, которая требует прямого контакта с оборудованием, например, CUDA, доступ к ключу.
2. Создайте оболочку dll, измените код exe для вызова этого Wrap dll, а затем Wrap dll вызывает аппаратную dll.
3. Создайте файл "wrapsome.spec" с https://wiki.winehq.org/Winelib_User%27s_Guide#The_Spec_file требования.
4. скопируйте код переноса в Ubuntu 16.04, переключитесь в исходный каталог кода переноса и выполните приведенную ниже команду в оболочка:

winemaker --dll --nosource-fix -DWRAPSOME_EXPORTS -I../deps/hdaware -L../deps/hdaware -lhdaware .

затем я получил файл «Makefile» и добавил -fPIC к LDFLAGS.
5. Продолжаю запускать «make», да, я получил wrapsome.dll.so и скопировал его в каталог встроенных dll для вина. . 6. в итоге мне не удалось запустить "wine64 portsome.exe", вопрос упомянут выше.
отчет вина "нереализованная функция 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 https://github.com/wine-mirror/wine/blob/fdac39f697e049ead215b164bfe6953269ffa7be/dlls/ntdll/loader.c#L660, кажется
exports = RtlImageDirectoryEntryToData( imp_mod, TRUE, IMAGE_DIRECTORY_ENTRY_EXPORT, &exp_size ); не удается экспортировать таблицу символов файла warpsome.dll.so который я компилирую с помощью цепочки инструментов winemaker+winegcc.


person Haffon    schedule 23.09.2017    source источник


Ответы (1)


Я изменил файл 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

и сделайте еще раз, затем скопируйте в каталог винных dll, все работает! И я знаю, что нет необходимости менять ссылку exe на warp dll в Windows, просто создайте dll.so с извлечением того же имени экспорта, которое нужно для exe, это тоже должно работать. Я попробую позже.

person Haffon    schedule 24.09.2017
comment
Я попробовал и работает, просто не забудьте использовать имя файла в нижнем регистре, даже если в Windows оно заглавное. - person Haffon; 24.09.2017
comment
Вы можете оставить свой qq. У меня такая же проблема, спасибо. - person partida; 04.01.2019