+ emu_init(lowest_segment);
+
+ // generate stack frame: argc, argv[], NULL, env[], NULL
+ for (envc = 0; environ[envc] != NULL; envc++)
+ ;
+
+ stack_frame = calloc(argc + envc + 3, sizeof(stack_frame[0]));
+ if (stack_frame == NULL) {
+ fprintf(stderr, "stack_frame OOM\n");
+ return 1;
+ }
+
+ // update the environment
+ setenv("_", bin_path, 1);
+
+ sfp = 0;
+ stack_frame[sfp++] = argc - 1;
+ for (i = 1; i < argc; i++)
+ stack_frame[sfp++] = (long)argv[i];
+ stack_frame[sfp++] = 0;
+ for (i = 0; i < envc; i++)
+ stack_frame[sfp++] = (long)environ[i];
+ stack_frame[sfp++] = 0;
+
+ log("entering %08x, %d stack entries\n", hdr.e_entry, sfp);
+ do_entry(hdr.e_entry, stack_frame, sfp, NULL);
+
+ fprintf(stderr, "do_entry failed!\n");
+ return 1;