mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-03-01 06:28:21 +00:00
The "no modify self" variant of Actually Portable Executable is now supported on all platforms. If you use `$(APE_NO_MODIFY_SELF)` then ld.bfd will embed a 4096 byte ELF binary and a 4096 byte Macho file which are installed on the fly to ${TMPDIR:-/tmp}, which enables us launch the executable, without needing to copy the whole executable To prevent it from copying a tiny executable to your temp directory you need to install the `ape` command (renamed from ape-loader), to a system path. For example: # FreeBSD / NetBSD / OpenBSD make -j8 o//ape/ape cp o//ape/ape /usr/bin/ape # Mac OS # make -j8 o//ape/ape.macho curl https://justine.lol/ape.macho >/usr/bin/ape chmod +x /usr/bin/ape On Linux you can get even more performance with the new binfmt_misc support which makes launching non-modifying APE binaries as fast as launching ELF executables. Running the following command: # Linux ape/apeinstall.sh Will copy APE loader to /usr/bin/ape and register with binfmt_misc Lastly, this change also fixes a really interesting race condition with OpenBSD thread joining.
36 lines
1.5 KiB
C
36 lines
1.5 KiB
C
#if 0
|
|
/*─────────────────────────────────────────────────────────────────╗
|
|
│ To the extent possible under law, Justine Tunney has waived │
|
|
│ all copyright and related or neighboring rights to this file, │
|
|
│ as it is written in the following disclaimers: │
|
|
│ • http://unlicense.org/ │
|
|
│ • http://creativecommons.org/publicdomain/zero/1.0/ │
|
|
╚─────────────────────────────────────────────────────────────────*/
|
|
#endif
|
|
#include "libc/dce.h"
|
|
#include "libc/runtime/runtime.h"
|
|
#include "libc/stdio/stdio.h"
|
|
|
|
/**
|
|
* @fileoverview Non-Self-Modifying APE Binary Demo
|
|
*
|
|
* See examples/examples.mk for the build config, which uses the
|
|
* alternative APE runtime.
|
|
*/
|
|
|
|
int main(int argc, char *argv[]) {
|
|
if (_base[0] == 'M' && _base[1] == 'Z') {
|
|
printf("success: %s spawned without needing to modify its "
|
|
"executable header, thanks to APE loader\n",
|
|
argv[0]);
|
|
if (!IsWindows()) {
|
|
printf(", thanks to APE loader!\n");
|
|
} else {
|
|
printf(", because you ran it on Windows :P\n");
|
|
}
|
|
return 0;
|
|
} else {
|
|
printf("error: %s doesn't have an MZ file header!\n", argv[0]);
|
|
return 1;
|
|
}
|
|
}
|