2017-09-23 3 views
0

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.

Répondre

0

J'ai changé le fichier wrapsome.spec à ce contenu:

@ stdcall wrap_SOME_InitAwareSDK(ptr) wrap_SOME_InitAwareSDK 
@ stdcall wrap_SOME_UninitAwareSDK(ptr) wrap_SOME_UninitAwareSDK 
@ stdcall wrap_SOME_GetVersion() wrap_SOME_GetVersion 

et faire à nouveau, puis cp à vin répertoire dll, ça marche! Et je sais qu'il n'y a pas besoin de changer le lien exe pour warper dll dans Windows, il suffit de construire un dll.so avec le même nom d'exportation qui a besoin par exe, il devrait fonctionner aussi. Je vais essayer plus tard.

+0

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