diff --git a/loader/glibc.c b/loader/glibc.c index 4d15d5c76b6..9aae1c11f40 100644 --- a/loader/glibc.c +++ b/loader/glibc.c @@ -21,8 +21,12 @@ #include "config.h" #include "wine/port.h" +#include #include #include +#ifdef HAVE_SYS_MMAN_H +# include +#endif #ifdef HAVE_UNISTD_H # include #endif @@ -81,6 +85,18 @@ static const char *build_new_path( const char *path, const char *name ) return ret; } +static void check_vmsplit( void *stack ) +{ + if (stack < (void *)0x80000000) + { + /* if the stack is below 0x80000000, assume we can safely try a munmap there */ + if (munmap( (void *)0x80000000, 1 ) == -1 && errno == EINVAL) + fprintf( stderr, + "Warning: memory above 0x80000000 doesn't seem to be accessible.\n" + "Wine requires a 3G/1G user/kernel memory split to work properly.\n" ); + } +} + /********************************************************************** * main */ @@ -103,6 +119,7 @@ int main( int argc, char *argv[] ) loader = new_name; } + check_vmsplit( &argc ); wine_exec_wine_binary( NULL, argv, loader ); fprintf( stderr, "wine: could not exec %s\n", threads ); exit(1);