Module: wine Branch: master Commit: 2d91f7def15cb0df65fdb87c19e24a5a6c99839e URL: https://source.winehq.org/git/wine.git/?a=commit;h=2d91f7def15cb0df65fdb87c1...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Sep 3 12:16:52 2020 +0200
ntdll: Load libwine dynamically.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/Makefile.in | 2 +- dlls/ntdll/unix/env.c | 15 +++++--------- dlls/ntdll/unix/loader.c | 45 ++++++++++++++++++++++++++++++++++++++++-- dlls/ntdll/unix/unix_private.h | 1 + 4 files changed, 50 insertions(+), 13 deletions(-)
diff --git a/dlls/ntdll/Makefile.in b/dlls/ntdll/Makefile.in index bf1755c879..52f63892af 100644 --- a/dlls/ntdll/Makefile.in +++ b/dlls/ntdll/Makefile.in @@ -3,7 +3,7 @@ MODULE = ntdll.dll IMPORTLIB = ntdll IMPORTS = winecrt0 EXTRAINCL = $(UNWIND_CFLAGS) -EXTRALIBS = -lwine $(IOKIT_LIBS) $(COREFOUNDATION_LIBS) $(CORESERVICES_LIBS) $(RT_LIBS) $(PTHREAD_LIBS) $(UNWIND_LIBS) $(I386_LIBS) +EXTRALIBS = $(IOKIT_LIBS) $(COREFOUNDATION_LIBS) $(CORESERVICES_LIBS) $(RT_LIBS) $(PTHREAD_LIBS) $(UNWIND_LIBS) $(I386_LIBS) EXTRADLLFLAGS = -mno-cygwin -nodefaultlibs -Wl,--image-base,0x7bc00000
C_SRCS = \ diff --git a/dlls/ntdll/unix/env.c b/dlls/ntdll/unix/env.c index 43920135a0..e1a3d33957 100644 --- a/dlls/ntdll/unix/env.c +++ b/dlls/ntdll/unix/env.c @@ -60,18 +60,13 @@
WINE_DEFAULT_DEBUG_CHANNEL(environ);
-extern int __wine_main_argc; -extern char **__wine_main_argv; -extern char **__wine_main_environ; -extern WCHAR **__wine_main_wargv; - USHORT *uctable = NULL, *lctable = NULL; SIZE_T startup_info_size = 0;
int main_argc = 0; char **main_argv = NULL; char **main_envp = NULL; -static WCHAR **main_wargv; +WCHAR **main_wargv = NULL;
static LCID user_lcid, system_lcid; static LANGID user_ui_language, system_ui_language; @@ -966,10 +961,10 @@ void init_environment( int argc, char *argv[], char *envp[] ) uctable = case_table + 2; lctable = case_table + case_table[1] + 2; } - __wine_main_argc = main_argc = argc; - __wine_main_argv = main_argv = argv; - __wine_main_wargv = main_wargv = build_wargv( argv ); - __wine_main_environ = main_envp = envp; + main_argc = argc; + main_argv = argv; + main_wargv = build_wargv( argv ); + main_envp = envp; }
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index 5f8fcd82be..bc5b627cbc 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -87,7 +87,6 @@ #include "winternl.h" #include "unix_private.h" #include "wine/list.h" -#include "wine/library.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(module); @@ -815,6 +814,48 @@ static void load_builtin_callback( void *module, const char *filename ) callback_module = module; }
+ +/*********************************************************************** + * load_libwine + */ +static void load_libwine(void) +{ +#ifdef __APPLE__ +#define LIBWINE "libwine.1.dylib" +#elif defined(__ANDROID__) +#define LIBWINE "libwine.so" +#else +#define LIBWINE "libwine.so.1" +#endif + typedef void (*load_dll_callback_t)( void *, const char * ); + static void (*p_wine_dll_set_callback)( load_dll_callback_t load ); + static int *p___wine_main_argc; + static char ***p___wine_main_argv; + static char ***p___wine_main_environ; + static WCHAR ***p___wine_main_wargv; + + char *path; + void *handle; + + if (build_dir) path = build_path( build_dir, "libs/wine/" LIBWINE ); + else path = build_path( dll_dir, "../" LIBWINE ); + + if (!(handle = dlopen( path, RTLD_NOW )) && !(handle = dlopen( LIBWINE, RTLD_NOW ))) return; + + p_wine_dll_set_callback = dlsym( handle, "wine_dll_set_callback" ); + p___wine_main_argc = dlsym( handle, "__wine_main_argc" ); + p___wine_main_argv = dlsym( handle, "__wine_main_argv" ); + p___wine_main_wargv = dlsym( handle, "__wine_main_wargv" ); + p___wine_main_environ = dlsym( handle, "__wine_main_environ" ); + + if (p_wine_dll_set_callback) p_wine_dll_set_callback( load_builtin_callback ); + if (p___wine_main_argc) *p___wine_main_argc = main_argc; + if (p___wine_main_argv) *p___wine_main_argv = main_argv; + if (p___wine_main_wargv) *p___wine_main_wargv = main_wargv; + if (p___wine_main_environ) *p___wine_main_environ = main_envp; +} + + /*********************************************************************** * dlopen_dll */ @@ -1610,7 +1651,7 @@ void __wine_main( int argc, char *argv[], char *envp[] ) load_ntdll();
init_environment( argc, argv, envp ); - wine_dll_set_callback( load_builtin_callback ); + load_libwine();
#ifdef __APPLE__ apple_main_thread(); diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index 3185f3a8ac..39edee09a0 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -129,6 +129,7 @@ extern SIZE_T startup_info_size DECLSPEC_HIDDEN; extern int main_argc DECLSPEC_HIDDEN; extern char **main_argv DECLSPEC_HIDDEN; extern char **main_envp DECLSPEC_HIDDEN; +extern WCHAR **main_wargv DECLSPEC_HIDDEN; extern unsigned int server_cpus DECLSPEC_HIDDEN; extern BOOL is_wow64 DECLSPEC_HIDDEN; extern HANDLE keyed_event DECLSPEC_HIDDEN;