Revision 7d8cec95

b/linux-user/main.c
2215 2215
           "-drop-ld-preload  drop LD_PRELOAD for target process\n"
2216 2216
           "-E var=value      sets/modifies targets environment variable(s)\n"
2217 2217
           "-U var            unsets targets environment variable(s)\n"
2218
           "-0 argv0          forces target process argv[0] to be argv0\n"
2218 2219
           "\n"
2219 2220
           "Debug options:\n"
2220 2221
           "-d options   activate log (logfile=%s)\n"
......
2266 2267
    const char *r;
2267 2268
    int gdbstub_port = 0;
2268 2269
    char **target_environ, **wrk;
2270
    char **target_argv;
2271
    int target_argc;
2269 2272
    envlist_t *envlist = NULL;
2273
    const char *argv0 = NULL;
2274
    int i;
2270 2275

  
2271 2276
    if (argc <= 1)
2272 2277
        usage();
......
2323 2328
            r = argv[optind++];
2324 2329
            if (envlist_unsetenv(envlist, r) != 0)
2325 2330
                usage();
2331
        } else if (!strcmp(r, "0")) {
2332
            r = argv[optind++];
2333
            argv0 = r;
2326 2334
        } else if (!strcmp(r, "s")) {
2327 2335
            if (optind >= argc)
2328 2336
                break;
......
2435 2443
    target_environ = envlist_to_environ(envlist, NULL);
2436 2444
    envlist_free(envlist);
2437 2445

  
2438
    if (loader_exec(filename, argv+optind, target_environ, regs, info) != 0) {
2446
    /*
2447
     * Prepare copy of argv vector for target.
2448
     */
2449
    target_argc = argc - optind;
2450
    target_argv = calloc(target_argc + 1, sizeof (char *));
2451
    if (target_argv == NULL) {
2452
	(void) fprintf(stderr, "Unable to allocate memory for target_argv\n");
2453
	exit(1);
2454
    }
2455

  
2456
    /*
2457
     * If argv0 is specified (using '-0' switch) we replace
2458
     * argv[0] pointer with the given one.
2459
     */
2460
    i = 0;
2461
    if (argv0 != NULL) {
2462
        target_argv[i++] = strdup(argv0);
2463
    }
2464
    for (; i < target_argc; i++) {
2465
        target_argv[i] = strdup(argv[optind + i]);
2466
    }
2467
    target_argv[target_argc] = NULL;
2468

  
2469
    if (loader_exec(filename, target_argv, target_environ, regs, info) != 0) {
2439 2470
        printf("Error loading %s\n", filename);
2440 2471
        _exit(1);
2441 2472
    }
2442 2473

  
2474
    for (i = 0; i < target_argc; i++) {
2475
        free(target_argv[i]);
2476
    }
2477
    free(target_argv);
2478

  
2443 2479
    for (wrk = target_environ; *wrk; wrk++) {
2444 2480
        free(*wrk);
2445 2481
    }

Also available in: Unified diff