[PATCH] libwine: Fix the init procedure to call __wine_main just like the main laoder does
Martin Storsjo
martin at martin.st
Wed Aug 19 03:31:27 CDT 2020
This is called if no preloader is available and the loader doesn't
find ntdll.so right away.
The codepath used normally has seen a fair bit of restructurings
in the past few months, while this codepath seems to have been
left as things were before.
Signed-off-by: Martin Storsjo <martin at martin.st>
---
libs/wine/loader.c | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/libs/wine/loader.c b/libs/wine/loader.c
index c3b59d9022..e54cbd4cc1 100644
--- a/libs/wine/loader.c
+++ b/libs/wine/loader.c
@@ -857,6 +857,14 @@ static int apple_alloc_thread_stack( void *base, size_t size, void *arg )
}
#endif
+static void *init_func_wrap( void *arg )
+{
+ void (*init_func)(int, char **, char **) =
+ (void(*)(int, char **, char **)) arg;
+ init_func( __wine_main_argc, __wine_main_argv, __wine_main_environ );
+ return NULL;
+}
+
/***********************************************************************
* apple_create_wine_thread
*
@@ -888,7 +896,7 @@ static void apple_create_wine_thread( void *init_func )
#endif
if (!pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE ) &&
- !pthread_create( &thread, &attr, init_func, NULL ))
+ !pthread_create( &thread, &attr, init_func_wrap, init_func ))
success = 1;
pthread_attr_destroy( &attr );
@@ -1090,7 +1098,7 @@ void wine_init( int argc, char *argv[], char *error, int error_size )
struct dll_path_context context;
char *path;
void *ntdll = NULL;
- void (*init_func)(void);
+ void (*init_func)(int, char **, char **);
/* force a few limits that are set too low on some platforms */
#ifdef RLIMIT_NOFILE
@@ -1105,9 +1113,8 @@ void wine_init( int argc, char *argv[], char *error, int error_size )
__wine_main_argc = argc;
__wine_main_argv = argv;
__wine_main_environ = __wine_get_main_environment();
- mmap_init();
- for (path = first_dll_path( "ntdll.dll", 0, &context ); path; path = next_dll_path( &context ))
+ for (path = first_dll_path( "ntdll", 0, &context ); path; path = next_dll_path( &context ))
{
if ((ntdll = dlopen( path, RTLD_NOW )))
{
@@ -1118,7 +1125,7 @@ void wine_init( int argc, char *argv[], char *error, int error_size )
}
free_dll_path( &context );
- if (!ntdll || !(init_func = dlsym( ntdll, "__wine_process_init" )))
+ if (!ntdll || !(init_func = dlsym( ntdll, "__wine_main" )))
{
if (error && error_size)
{
@@ -1136,6 +1143,6 @@ void wine_init( int argc, char *argv[], char *error, int error_size )
#ifdef __APPLE__
apple_main_thread( init_func );
#else
- init_func();
+ init_func( __wine_main_argc, __wine_main_argv, __wine_main_environ );
#endif
}
--
2.24.3 (Apple Git-128)
More information about the wine-devel
mailing list