diff --git a/ape/ape-m1.c b/ape/ape-m1.c index 4c32ebf85..6b9127054 100644 --- a/ape/ape-m1.c +++ b/ape/ape-m1.c @@ -35,7 +35,7 @@ #include #include -#define pagesz 16384 +#define pagesz 16384 /* maximum path size that cosmo can take */ #define PATHSIZE (PATH_MAX < 1024 ? PATH_MAX : 1024) #define SYSLIB_MAGIC ('s' | 'l' << 8 | 'i' << 16 | 'b' << 24) @@ -726,7 +726,7 @@ __attribute__((__noreturn__)) static void Spawn(const char *exe, int fd, register long *x0 __asm__("x0") = sp; register char *x2 __asm__("x2") = path; - register int x3 __asm__("x3") = 8; /* _HOSTXNU */ + register int x3 __asm__("x3") = 8; /* _HOSTXNU */ register struct Syslib *x15 __asm__("x15") = lib; register long x16 __asm__("x16") = e->e_entry; __asm__ volatile("mov\tx1,#0\n\t" @@ -1012,8 +1012,8 @@ int main(int argc, char **argv, char **envp) { Emit("usage: ape PROG [ARGV1,ARGV2,...]\n" " ape - PROG [ARGV0,ARGV1,...]\n" " ($0 = PROG.ape) [ARGV1,ARGV2,...]\n" - "actually portable executable loader silicon 1.9\n" - "copyright 2023 justine alexandra roberts tunney\n" + "actually portable executable loader silicon 1.10\n" + "copyrights 2023 justine alexandra roberts tunney\n" "https://justine.lol/ape.html\n"); _exit(1); } else { diff --git a/ape/ape.h b/ape/ape.h index 68ab61b0a..d2f589612 100644 --- a/ape/ape.h +++ b/ape/ape.h @@ -2,7 +2,7 @@ #define COSMOPOLITAN_APE_APE_H_ #define APE_VERSION_MAJOR 1 -#define APE_VERSION_MINOR 9 +#define APE_VERSION_MINOR 10 #define APE_VERSION_STR APE_VERSION_STR_(APE_VERSION_MAJOR, APE_VERSION_MINOR) #define APE_VERSION_NOTE APE_VERSION_NOTE_(APE_VERSION_MAJOR, APE_VERSION_MINOR) diff --git a/ape/apeuninstall.sh b/ape/apeuninstall.sh index cde7a7064..70cff8452 100755 --- a/ape/apeuninstall.sh +++ b/ape/apeuninstall.sh @@ -54,6 +54,7 @@ for x in .ape \ .ape-1.7 \ .ape-1.8 \ .ape-1.9 \ + .ape-1.10 \ .ape-blink-0.9.2 \ .ape-blink-1.0.0; do rm -f \ diff --git a/ape/loader.c b/ape/loader.c index 744e8fe14..6bbdf8af5 100644 --- a/ape/loader.c +++ b/ape/loader.c @@ -901,13 +901,8 @@ __attribute__((__noreturn__)) static void ShowUsage(int os, int fd, int rc) { "\n" "USAGE\n" "\n" - " ape [FLAGS] PROG [ARGV1,ARGV2,...]\n" - " ape [FLAGS] - PROG [ARGV0,ARGV1,...]\n" - "\n" - "FLAGS\n" - "\n" - " -h show this help\n" - " -f force loading of program (do not use execve)\n" + " ape PROG [ARGV1,ARGV2,...]\n" + " ape - PROG [ARGV0,ARGV1,...]\n" "\n", 0l); Exit(rc, os); @@ -982,20 +977,6 @@ EXTERN_C __attribute__((__noreturn__)) void ApeLoader(long di, long *sp, os = LINUX; } - /* parse flags */ - while (argc > 1) { - if (argv[1][0] != '-') break; /* normal argument */ - if (!argv[1][1]) break; /* hyphen argument */ - if (!StrCmp(argv[1], "-h") || !StrCmp(argv[1], "--help")) { - ShowUsage(os, 1, 0); - } else { - Print(os, 2, ape, ": invalid flag (pass -h for help)\n", 0l); - Exit(1, os); - } - *++sp = --argc; - ++argv; - } - /* we can load via shell, shebang, or binfmt_misc */ if ((literally = argc >= 3 && !StrCmp(argv[1], "-"))) { /* if the first argument is a hyphen then we give the user the @@ -1006,9 +987,13 @@ EXTERN_C __attribute__((__noreturn__)) void ApeLoader(long di, long *sp, argc = sp[3] = sp[0] - 3; argv = (char **)((sp += 3) + 1); } else if (argc < 2) { - Print(os, 2, ape, ": missing command name (pass -h for help)\n", 0l); - Exit(1, os); + ShowUsage(os, 2, 1); } else { + if (argv[1][0] == '-') { + rc = !(argv[1][1] == 'h' && !argv[1][2]) || !StrCmp(argv[1] + 1, + "-help"); + ShowUsage(os, 1 + rc, rc); + } prog = (char *)sp[2]; argc = sp[1] = sp[0] - 1; argv = (char **)((sp += 1) + 1); diff --git a/build/bootstrap/ape.aarch64 b/build/bootstrap/ape.aarch64 index 6c8f9305b..5624ea1ff 100755 Binary files a/build/bootstrap/ape.aarch64 and b/build/bootstrap/ape.aarch64 differ diff --git a/build/bootstrap/ape.elf b/build/bootstrap/ape.elf index 961bcf059..681dc58ff 100755 Binary files a/build/bootstrap/ape.elf and b/build/bootstrap/ape.elf differ diff --git a/build/bootstrap/ape.macho b/build/bootstrap/ape.macho index 9ba658e6f..d28976838 100755 Binary files a/build/bootstrap/ape.macho and b/build/bootstrap/ape.macho differ diff --git a/tool/cosmocc/README.md b/tool/cosmocc/README.md index cef09338b..ea486654d 100644 --- a/tool/cosmocc/README.md +++ b/tool/cosmocc/README.md @@ -108,7 +108,7 @@ On Apple Silicon, `aarch64-unknown-cosmo-cc` produces ELF binaries. If you build a hello world program, then you need to say `ape ./hello`. If you don't have an `ape` command then run `cc -o ape bin/ape-m1.c` which should be moved to `/usr/local/bin/ape`. Your APE interpreter might -already exist under a path like `$TMPDIR/.ape-1.9`. It's important to +already exist under a path like `$TMPDIR/.ape-1.10`. It's important to note this is only a gotcha for the cross compiler. Your `cosmocc` compiler wraps the actual ELF binaries with a shell script that'll extract and compile an APE loader automatically, as needed. This also