X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=loader%2Floader.c;h=df505424c9309a8aee8b7d61c3722d5dfb8ba8f0;hb=306e06f738dc1b1585c7db7c0e7bc36e2ba90f13;hp=530eed335e28c1e01d932ba6ba4136c5eabc1ef2;hpb=11913091045ebc44f003138d9e69cdc91fe4982e;p=ginge.git diff --git a/loader/loader.c b/loader/loader.c index 530eed3..df50542 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -60,11 +60,11 @@ int main(int argc, char *argv[]) FILE *fi; maps_range maps[16]; int map_cnt; - int i, ret; - long stack_frame[5]; + int i, ret, envc, sfp; + long *stack_frame; - if (argc != 2) { - fprintf(stderr, "usage: %s \n", argv[0]); + if (argc < 2) { + fprintf(stderr, "usage: %s [args]\n", argv[0]); return 1; } @@ -95,7 +95,7 @@ int main(int argc, char *argv[]) } HDR_CHECK_EQ(e_type, ET_EXEC, "not executable"); -// HDR_CHECK_EQ(e_machine, EM_ARM, "not ARM"); + HDR_CHECK_EQ(e_machine, EM_ARM, "not ARM"); HDR_CHECK_EQ(e_phentsize, sizeof(Elf32_Phdr), "bad PH entry size"); HDR_CHECK_NE(e_phnum, 0, "no PH entries"); @@ -150,15 +150,29 @@ int main(int argc, char *argv[]) emu_init(lowest_segment); - stack_frame[0] = 1; // argc - stack_frame[1] = (long)argv[1]; - stack_frame[2] = 0; - stack_frame[3] = (long)environ; - stack_frame[4] = 0; + // generate stack frame: argc, argv[], NULL, env[], NULL + for (envc = 0; environ[envc] != NULL; envc++) + ; - printf("entering %08x\n", hdr.e_entry); - do_entry(hdr.e_entry, stack_frame, 5, NULL); + stack_frame = calloc(argc + envc + 3, sizeof(stack_frame[0])); + if (stack_frame == NULL) { + fprintf(stderr, "stack_frame OOM\n"); + return 1; + } - return 0; + 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; + + printf("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; }