From c3193925d856b582dfd9c5e7ab47a126ffc3c05a Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 15 Jun 2004 20:31:06 +0000 Subject: [PATCH] Add the preloader itself as argv[0] and remove it again before running the real loader, this way the ps output makes more sense. --- libs/wine/config.c | 12 ++++++++++-- loader/preloader.c | 9 +++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/libs/wine/config.c b/libs/wine/config.c index 00119439ddd..d08fd0186e5 100644 --- a/libs/wine/config.c +++ b/libs/wine/config.c @@ -279,6 +279,7 @@ static void preloader_exec( char **argv, char **envp, int use_preloader ) { static const char preloader[] = "wine-preloader"; char *p, *full_name; + char **last_arg = argv, **new_argv; if (!(p = strrchr( argv[0], '/' ))) p = argv[0]; else p++; @@ -286,8 +287,15 @@ static void preloader_exec( char **argv, char **envp, int use_preloader ) full_name = xmalloc( p - argv[0] + sizeof(preloader) ); memcpy( full_name, argv[0], p - argv[0] ); memcpy( full_name + (p - argv[0]), preloader, sizeof(preloader) ); - if (envp) execve( full_name, argv, envp ); - else execv( full_name, argv ); + + /* make a copy of argv */ + while (*last_arg) last_arg++; + new_argv = xmalloc( (last_arg - argv + 2) * sizeof(*argv) ); + memcpy( new_argv + 1, argv, (last_arg - argv + 1) * sizeof(*argv) ); + new_argv[0] = full_name; + if (envp) execve( full_name, new_argv, envp ); + else execv( full_name, new_argv ); + free( new_argv ); free( full_name ); return; } diff --git a/loader/preloader.c b/loader/preloader.c index 1f29f6f727e..85dbd9cc535 100644 --- a/loader/preloader.c +++ b/loader/preloader.c @@ -2,7 +2,7 @@ * Preloader for ld.so * * Copyright (C) 1995,96,97,98,99,2000,2001,2002 Free Software Foundation, Inc. - * Copyright (C) 2004 Mike McCormack for Codeweavers + * Copyright (C) 2004 Mike McCormack for CodeWeavers * Copyright (C) 2004 Alexandre Julliard * * This library is free software; you can redistribute it and/or @@ -685,6 +685,7 @@ void* wld_start( void **stack ) pargc = *stack; argv = (char **)pargc + 1; + if (*pargc < 2) fatal_error( "Usage: %s wine_binary [args]\n", argv[0] ); /* skip over the parameters */ p = argv + *pargc + 1; @@ -717,7 +718,7 @@ void* wld_start( void **stack ) PROT_NONE, MAP_FIXED | MAP_PRIVATE | MAP_ANON | MAP_NORESERVE, -1, 0 ); /* load the main binary */ - map_so_lib( argv[0], &main_binary_map ); + map_so_lib( argv[1], &main_binary_map ); /* load the ELF interpreter */ interp = (char *)main_binary_map.l_addr + main_binary_map.l_interp; @@ -743,6 +744,10 @@ void* wld_start( void **stack ) SET_NEW_AV(10, AT_EGID, get_auxiliary( av, AT_EGID, getegid() ) ); #undef SET_NEW_AV + /* get rid of first argument */ + pargc[1] = pargc[0] - 1; + *stack = pargc + 1; + set_auxiliary_values( av, new_av, stack ); #ifdef DUMP_AUX_INFO