Alexandre Julliard : ntdll: Load libwine dynamically.
Alexandre Julliard
julliard at winehq.org
Thu Sep 3 15:26:46 CDT 2020
Module: wine
Branch: master
Commit: 2d91f7def15cb0df65fdb87c19e24a5a6c99839e
URL: https://source.winehq.org/git/wine.git/?a=commit;h=2d91f7def15cb0df65fdb87c19e24a5a6c99839e
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Sep 3 12:16:52 2020 +0200
ntdll: Load libwine dynamically.
Signed-off-by: Alexandre Julliard <julliard at 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;
More information about the wine-cvs
mailing list