Je ne peux pas me connecter WINEHQ Bugzilla, donc je demande ici et c'est l'exigence:
Nous avons une application Windows que nous avons exe code source, et il a utilisé ATL. Les DLL de l'exe dépendent d'un périphérique spécial, mais la plupart du temps ils ont une version linux. Maintenant, nous devons porter l'application Windows sur Linux.
Mon essai enfin: écrire une DLL du milieu pour envelopper une certaine lib qui est déjà multi plate-forme, l'exe appellera la nouvelle DLL du milieu, et je nomme la DLL du milieu est "WINE personnalisé build-in dll". CUSTOM signifie que je compile ce dll.so autonome par vigneron. Tout va bien jusqu'à l'exécuter sous wine64, la ligne de commande shell linux:wine ne peut pas charger mon dll intégré et signaler "appel à la fonction non implémentée"
wine64 portsome.exe
est ici la sortie:
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
Voici ma question:
comment puis-je compiler une version personnalisée du vin -dll pour faire Windows App native peut appeler sa fonction lors de l'exécution, est-il nécessaire de générer un faux DLL par Winebuilder? Détail des étapes Je travaille pour l'application port windows à linux:
1. trouve la DLL spéciale qui nécessite un contact direct avec le matériel, comme CUDA, l'accès au dongle.
2. créez une DLL d'enveloppe, changez le code d'exe pour appeler cette fonction de wrap dll, et la DLL d'enroulement appelle alors la DLL matérielle consciente.
3. Créez le fichier "wrapsome.spec" avec les exigences https://wiki.winehq.org/Winelib_User%27s_Guide#The_Spec_file.
4. Copiez le code wrap à Ubuntu 16.04, passer à envelopper répertoire source de code et exécutez ci-dessous commande en shell:
winemaker --dll --nosource-fix -DWRAPSOME_EXPORTS -I../deps/hdaware -L../deps/hdaware -lhdaware .
j'obtenu le fichier "Makefile" et j'append -fPIC LDFLAGS.
5. continuer à exécuter "make", oui, j'ai obtenu le wrapsome.dll.so, et je le copie dans le répertoire dlls wine build-in. 6. Enfin, j'ai échoué à exécuter "wine64 portsome.exe", la question est mentionnée ci-dessus.
rapport de vin « fonction de inappliquées wrapsome.dll.wrap_SOME_GetVersion », j'ai même confirmé avec nm wrapsome.dll.so
, et voici sa sortie:
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 [email protected]@WINE_1.0
U [email protected]@WINE_1.0
U [email protected]@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
Avis: Je l'ai rejeté un mot avec les communes car il est pas bon de montrer au public.
Je lis même le code source de vin dans github https://github.com/wine-mirror/wine/blob/fdac39f697e049ead215b164bfe6953269ffa7be/dlls/ntdll/loader.c#L660, il semble
exports = RtlImageDirectoryEntryToData(imp_mod, TRUE, IMAGE_DIRECTORY_ENTRY_EXPORT, &exp_size);
ne peut pas exporter la table des symboles de fichier warpsome.dll.so que je compile par la chaîne d'outils vigneron + winegcc.
J'ai essayé et fonctionne, n'oubliez pas d'utiliser le nom de fichier minuscule même s'il est en majuscules dans Windows. – Haffon