Releases: jart/cosmopolitan
Cosmopolitan v3.0
Release notes upcoming.
Cosmopolitan v2.2
Cosmopolitan Libc makes C/C++ a build-once run-anywhere language, like Java, except it doesn't need an interpreter or virtual machine. Instead, it reconfigures stock GCC to output a POSIX-approved polyglot format that runs natively on Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS or UEFI with the best possible performance and the tiniest footprint imaginable.
Getting Started
If you use Linux, then you can build Cosmopolitan and its included software from source as follows:
wget https://justine.lol/cosmopolitan/cosmopolitan-2.2.tar.gz
tar xf cosmopolitan-2.2.tar.gz
cd cosmopolitan
build/bootstrap/make.com -j8
o//examples/hello.com
If you're doing your development work on Linux or BSD and you want to bring your own build system, then you need just five files to get started:
wget https://justine.lol/cosmopolitan/cosmopolitan-amalgamation-2.2.zip
unzip cosmopolitan-amalgamation-2.2.zip
printf 'main() { printf("hello world\\n"); }\n' >hello.c
gcc -g -Os -static -nostdlib -nostdinc -fno-pie -no-pie -mno-red-zone -gdwarf-4 \
-fno-omit-frame-pointer -pg -mnop-mcount -mno-tls-direct-seg-refs \
-o hello.com.dbg hello.c -fuse-ld=bfd -Wl,-T,ape.lds -Wl,--gc-sections \
-include cosmopolitan.h crt.o ape-no-modify-self.o cosmopolitan.a
objcopy -S -O binary hello.com.dbg hello.com
Features
- Implement POSIX semaphores 8111462
- Implement POSIX cancellations 2278327 022536c 3f0bcdc 3f0bcdc 4a6fd3d e522aa3
- Implement atomic swar token bucket library for DDOS protection e7329b7
- Introduce sigtimedwait() and sigwaitinfo() 467a332
- Invent iso8601us() for faster timestamps f7ff77d
- Work towards zipos / open(argv[0]) on metal cb9a046
- Introduce readdir_r, scandir, pthread_kill, sigsetjmp, etc.. e557058
- Allow more fine-grained control over bare metal page permissions d387006
- Make cli commands yoinkable into cosmo shell 3d2d04b
- Support Ctrl-Left / Ctrl-Right keystrokes in Bestline
- Introduce a ParseCidr() API c995838
Fixes and Improvements
- Make fcntl() locks on Windows work well enough to support SQLite 997ce29
- Make fork/system/popen thread safe 60cb435 f52f65b
- Fix support for WSL1 platform fc96af0 f44d887 d6ff4c7 fae0c02 14d036b
- Fix bug: do not initialize IDT & TSS if unneeded (#654)
- Integrate upstream dash changes into unbourne shell (#656)
- Import more of the remaining math library routines from Musl e557058
- Make the conformance of libc/isystem/ headers nearly perfect e557058
- Fixed bug where stdio eof wasn't being sticky d5910e2
- Fixed bug where fseeko() wasn't clearing eof state d5910e2
- Fix ParseHttpMessage failing to store >2 repeatable headers (#657)
- Fix a harmless integer overflow in ParseIp() c995838
- Improve cosmo's conformance to libc-test e557058
- Improve lock performance on NetBSD c995838
- Elevate the quality of getrandom() and getentropy() 3f0bcdc
- Make Windows fcntl() and lseek() fixes da8f500
- Windows fork() now restores TLS memory of calling thread e522aa3
- More cosmocc toolchain FOSS compatibility improvements 5af19b7
- Rewrite makedirs() so it doesn't need dynamic memory 0f89140
- Rewrite putenv() and friends to conform to POSIX f7ff77d
- Permit Linux OFD fcntl() locks under pledge(flock) f7ff77d
- Support closefrom() on NetBSD
- Support tgkill() on FreeBSD
Breakages
Cosmopolitan v2.1.1
Cosmopolitan Libc makes C/C++ a build-once run-anywhere language, like Java, except it doesn't need an interpreter or virtual machine. Instead, it reconfigures stock GCC to output a POSIX-approved polyglot format that runs natively on Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS or UEFI with the best possible performance and the tiniest footprint imaginable.
This release fixes bugs and makes system call wrapper improvements:
- Fix corner case in Linux stack mappings 3b4fcd8
- Implement clock_nanosleep() across platforms and refactor sleeping code to use it.
- Polyfill futexes on unsupported platforms by polling memory with exponential backoff
- Imported *NSYNC unit tests and confirmed we're passing them (except for cancellations on Windows)
- system() now uses our builtin cocmd interpreter which offers a subset of bourne that works on windows and is fast
- sched_setaffinty() is now explicitly for processes since we now have pthread_setaffinity_np() for threads
- Numerous improvements to system call documentation, especially when it comes to possible errno results
- Change accept type to
struct sockaddr *
(#630) - Rewrite brk() and sbrk() 5005f2e which can be used by tiny apps that don't want to link mmap() and would rather have 4096-byte memory granularity, with the tradeoff of not working on Windows
We're working to make every Cosmopolitan binary a true operating system by introducing features like VGA support:
- Fix sys_mmap_metal() for non-MAP_FIXED case (#651)
- Show "screen of death" on VGA console upon program crash (#650)
- Add basic character output for VGA graphics mode console (#649
Other changes:
redbean v2.1
redbean is an open source webserver in a zip executable that runs on six operating systems. The basic idea is if you want to build a web app that runs anywhere, then you download the redbean.com file, put your .html and .lua files inside it using the zip command, and then you've got a hermetic app you can deploy and share.
- New
unix.mapshared()
api that lets you allocate memory that's shared between processes. It returns a module that has atomics and futexes. A demo script has been added that shows how it can be used to serialize a JSONGetPath()
hit counter to shared memory. - This release fixes a bug with the parsing of space / plus parameters in the Request-URI.
- Proof of concept of sqlite serialization (#436)
- Lua's
os.execute()
function will now use Cosmopolitan's builtin cocmd interpreter, which provides a subset of bourne shell features, with faster performance, and consistent behavior across unixes and windows. - Fix re.NOSUB memory error (#645)
- Update redbean api definitions (#652)
- Make HTTP message parsing a little faster
- Permit multiple certs with same common name
This is the first redbean release announcement that's been shared on GitHub. It only reflects the changes to redbean since 2.0.19. The web page for the 2.0.x release series is at https://redbean.dev/2.0.html which has links at the bottom to pages detailing older releases. For details on features and bug fixes that were introduced during the series over the past several months, please see the cosmo commit log.
pledge.com v1.8
Cosmopolitan v2.1
Cosmopolitan Libc makes C/C++ a build-once run-anywhere language, like Java, except it doesn't need an interpreter or virtual machine. Instead, it reconfigures stock GCC to output a POSIX-approved polyglot format that runs natively on Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS or UEFI with the best possible performance and the tiniest footprint imaginable.
Getting Started
If you use Linux, then you can build Cosmopolitan and its included software from source as follows:
wget https://justine.lol/cosmopolitan/cosmopolitan-2.1.tar.gz
tar xf cosmopolitan-2.1.tar.gz
cd cosmopolitan
build/bootstrap/make.com -j8
o//examples/hello.com
If you're doing your development work on Linux or BSD and you want to bring your own build system, then you need just five files to get started:
wget https://justine.lol/cosmopolitan/cosmopolitan-amalgamation-2.1.zip
unzip cosmopolitan-amalgamation-2.1.zip
printf 'main() { printf("hello world\\n"); }\n' >hello.c
gcc -g -Os -static -nostdlib -nostdinc -fno-pie -no-pie -mno-red-zone -gdwarf-4 \
-fno-omit-frame-pointer -pg -mnop-mcount -mno-tls-direct-seg-refs \
-o hello.com.dbg hello.c -fuse-ld=bfd -Wl,-T,ape.lds -Wl,--gc-sections \
-include cosmopolitan.h crt.o ape-no-modify-self.o cosmopolitan.a
objcopy -S -O binary hello.com.dbg hello.com
Features
- Introduce POSIX threads support with locking primitives based on *NSYNC
- Add VGA terminal support on bare metal (see examples/vga.c) 3fdb1c1
- System call portability is now documented at https://justine.lol/cosmopolitan/functions.html
- Add cosmocc and cosmoc++ scripts which can serve as an open source toolchain 6cc9e08
- Add lchown(), lchmod(), statvfs(), fstatvfs() 5a632cf
- Add sigpending() a849a63
- Add getgroups() and setgroups() 4c40c50
- Implement inet_pton for AF_INET6 d213a48
- The _gc() garbage collector is now thread safe 0e2b1bf
- Use OpenBSD qsort() which is faster (quicksort) and secure (heapsort fallback) d861d27
- Add notpossible keyword and _npassert() 0c70e89
- IPv6 is now polyfilled on non-Linux 0547eab
- Introduce
MODE=fastbuild
and shorthand notationm=fastbuild
Bug Fixes
- Upgrade to the latest Chromium Zlib. This improves security and performance 224c12f 775944a
- Fix out of bounds read in IP address parser 775944a
- APE binaries now work better with BusyBox 0305194
- Numerous fixes to bare metal support 3733b43 8569704 e0fabd1
- Fix bug where SIG_IGN and SIG_DFL weren't working as advertised on BSDs c5c4dfc
- Improve quality of raise(), abort(), and tkill() c5c4dfc
- Improve quality of uname(), gethostname(), and getdomainname() b66bd06
- Improve quality of clock() 12d9e1e
- Improve quality of copy_file_range(), sendfile(), splice(), openpty(), closefrom(), close_range(), fadvise() and posix_fadvise() c7a8cd2 9fa6725
- Fix _Thread_local with fork() on Windows bf757c4
- Improve zipos path handling 1ef955c
- Fix preadv() and pwritev() for old distros 3f49889
- Support fcntl(F_DUPFD_CLOEXEC) on more systems 3f49889
- Fix POSIX advisory locks on Windows 3f49889
- Fix race condition in makedirs() 571c2c3
- Fix pledge() thread kill semantics 1ea01fc
- Improve open source compatibility b73e35c dbf12c3 55c6297
- Make
SIG_DFL
andSIG_IGN
C++ compatible 8cd4248 - Discard ignored signals on New Technology 7de2f22
- Fix inability to add some signals to mask on NT 5986408
- Fix issue with ZipOS file descriptors in MODE=asan 3265324
- The virtual memory layout is now more optimized b69f3d2
- Repository is now buildable by GCC11
Breaking changes
- Underscore added to many non-standard APIs to improve open source compatibility 6f7d0cb
- Windows 7 and Vista support has now been moved to our vista branch 134ffee
- Add sys_ prefix to unwrapped system calls to improve open source compatibility aab4ee4
- Debug symbols now removed from
MODE=tiny*
builds by default - Removed
testonly
keyword
Third Party
- FreeBSD's
o//examples/script.com
can record and playback terminal screencasts on five OSes 1ad2f53 - NetBSD's
sed
command is now available in third_party/sed/ - The One True Awk is now available in third_party/awk/ and https://justine.lol/awk/
Community
- We built an online game (https://ipv4.games/) based on Redbean that handled 600 qps on just 2 vcpu (Loam and https://github.com/shamblesides/turfwar/)
- We got Actually Portable Perl 96% passing test suites (G4Vi https://github.com/G4Vi/perl5/blob/cosmo/README.cosmo)
- We got Actually Portable Python 3.11.0rc1 passing 96% test suites (ahgamut https://github.com/ahgamut/cpython/tree/cosmo_py311)
- We got 176 Actually Portable Rust demo programs to build (ahgamut https://github.com/ahgamut/rust-ape-example)
2.0.1
Cosmopolitan v2.0
Cosmopolitan Libc makes C/C++ a build-once run-anywhere language, like Java, except it doesn't need an interpreter or virtual machine. Instead, it reconfigures stock GCC to output a POSIX-approved polyglot format that runs natively on Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS or UEFI with the best possible performance and the tiniest footprint imaginable.
Getting Started
If you use Linux, then you can build Cosmopolitan and its included software from source as follows:
wget https://justine.lol/cosmopolitan/cosmopolitan-2.0.tar.gz
tar xf cosmopolitan-2.0.tar.gz
cd cosmopolitan
build/bootstrap/make.com -j8
o//examples/hello.com
If you're doing your development work on Linux or BSD and you want to bring your own build system, then you need just five files to get started:
wget https://justine.lol/cosmopolitan/cosmopolitan-amalgamation-2.0.zip
unzip cosmopolitan-amalgamation-2.0.zip
printf 'main() { printf("hello world\\n"); }\n' >hello.c
gcc -g -Os -static -nostdlib -nostdinc -fno-pie -no-pie -mno-red-zone \
-fno-omit-frame-pointer -pg -mnop-mcount -mno-tls-direct-seg-refs \
-o hello.com.dbg hello.c -fuse-ld=bfd -Wl,-T,ape.lds -Wl,--gc-sections \
-include cosmopolitan.h crt.o ape-no-modify-self.o cosmopolitan.a
objcopy -S -O binary hello.com.dbg hello.com
Breaking Changes
- You have to use
/zip/...
rather thanzip:...
when open()'ing assets stored in the PKZIP structure of your executable program. 00611e9 - You should use
/c/...
paths on Windows rather thanC:/...
. Your arguments and environment variables will be patched conservatively by the runtime to normalize$PATH
and make life easy. It's still possible to use DOS, WIN32, NT, and other Microsoft-style paths with our APIs. - The default stack size has been reduced to 128kb. To learn how to increase this limit, or log your stack usage, please see 226aaf3
- We renamed
LOGF
toINFOF
in the logging API. 0584684 - We no longer define
intmax_t
as 128-bit. We now violate the standard like everyone else, by defining it as 64-bit. We've introduced a new%jjd
formatting directive forint128_t
. Functions likebsrmax()
are now calledbsr128()
. 868af3f - We've renamed
nothrow
todontthrow
andnodiscard
is nowdontdiscard
. 868af3f - Remove undocumented and ANSI WIN32 APIs in d3b599a and a157940
Features
- We now favor the new APE loader (see ape-no-modify-self.o). It's extracted automatically. It's fast. It maps your programs into memory without copying or self-modifying the header. An
--assimilate
flag is baked-in to the shell script at the tops of your binaries, so you can convert them to the platform-local format whenever you want. If you're using binfmt_misc then a separate assimilate program is provided for doing just that. We also still distribute the classic ape.o bootloader. 47a53e1 - Binfmt_misc support for Linux users. This is the fastest way to run APE programs. You can install it by running the
ape/apeinstall.sh
program in this repository. - We've polyfilled the OpenBSD pledge() and unveil() system calls for Linux. You can now use these APIs in your C/C++/Python/Redbean programs, or you can use the new pledge.com command to sandbox your existing Linux userspace.
- We now use Landlock Make to build the repository, since it offers sandboxing and hermeticity guarantees. Our project will still build fine using vanilla GNU Make, since Landlock Make is backwards compatible.
- We now offer support for threading that works on all six supported operating systems. Use the
_spawn()
and_join()
functions. We're working on POSIX Threads support and recommend using our newpthread_mutex_lock
implementation. For examples of multi-threaded programs, see examples/greenbean.c and tool/build/mkdeps.c. - You can now use the
_Thread_local
keyword. Your C runtime will now always initialize Thread-Local Storage (TLS) for your main process thread. Doing that means the minimum APE binary size had to be increased from 12kb to 16kb. We prefer using the%fs
register. You must use the-mno-tls-direct-seg-refs
flag. On Windows and Apple platforms, your executable will rewritten in memory at initialization to turn%fs
opcodes into%gs
. If you wish to control your segment registers, then you may do so by setting__tls_enabled
to false and callingarch_prctl
. Please note if you use threads, this will makeerrno
no longer thread safe. - We now uniquely polyfill
mmap(MAP_STACK)
which brings the FreeBSD behavior to Linux. You must use it if you want your code to run on OpenBSD. Please see the mmap() documentation to learn more. - The Cosmopolitan monolithic repository now offers the LLVM LIBCXX Standard Template Library for C++ developers. This is not currently available in the amalgamation.
- Your Cosmopolitan binaries now include an
--ftrace
flag which logs C function calls to standard error. Please read the Logging C Functions blog post which explains more. You need to use the-pg
(and hopefully also-mnop-mcount
) flag for this to work. If you don't want this functionality in your runtime, useMODE=tiny
orMODE=rel
. - Your Cosmopolitan binaries now include an
--strace
flag which logs system calls to standard error. This works consistently across platforms. It's especially helpful for ZIP-related system calls, which aren't handled by the kernel. Please read the Logging C Functions blog post which explains more. If you don't want this functionality in your runtime, useMODE=tiny
orMODE=rel
. 14e192e - You can now use Actually Portable Python by building
o//third_party/python/python.com
which includes animport cosmo
module that lets you use our best features too. - New
closefrom()
system call for Linux 5.9+, FreeBSD 8+, and OpenBSD. - The
clock_gettime
andgettimeofday
functions now go 10x faster on Linux via the vDSO. - Our ASAN module is now able to trace the origin of memory allocations when generating reports.
- Complex math functions are now available, thanks to Musl Libc.
- Many math functions, e.g. pow(), now go faster, thanks to ARM.
- New
nointernet()
function which is similar in spirit to djb'sdisablenetwork()
function. - New string appending library. See appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf, and vappendf. What makes this library good is it's (a) fast, and (b) strings made by these functions can be passed to free().
- We now offer a bulletproof unbreakable kprintf() family of functions as part of the
privileged
runtime. - SSL performance is now significantly improved. See 398f0c1 and f3e28aa and similar changes where we've added x86 optimizations for computing SHA faster, Intel ADX code that makes RSA multiplication faster, clean up code to make Everest curve25519 faster, and wrote an assembly implementation of NIST curve quasi-reduction.
Bug Fixes
- Fork on Windows now works reliably 0cb6b6f 98909b1 e5314de
- Memory maps on Windows now work reliably
- Signals on Windows now works well enough for Redbean to offer a web server with a repl 072e1d2
- Fix %c with nul character 3c28533
- There's been a lot of fixes and fine tuning to the system call support magnums in consts.sh and syscalls.sh
- Many system call polyfills have been improved, e.g. sysinfo, statfs, pselect, ppoll, sleep, sched_yield, utimensat, setsockopt, clock_gettime, sigsuspend, etc.
- We now polyfill ENOENT vs. ENOTDIR on Windows
- Daemonization now works on Windows
Cosmopolitan v1.0
Cosmopolitan Libc makes C a build-once run-anywhere language, like Java, except it doesn't need an interpreter or virtual machine. Instead, it reconfigures stock GCC and Clang to output a POSIX-approved polyglot format that runs natively on Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS or UEFI with the best possible performance and the tiniest footprint imaginable.
Changes
- Productionize redbean web server bf03b2e af59806 01e6b3a e56a9d0 690be54 472b95f c029e83
- Make it possible for APE binaries to modify their own ZIP contents bf03b2e daa32d2 b918706 690be54
- Introduce
OpenExecutable
for restoring APE bf03b2e or alternativelyape-no-modify-self.o
da8a08f - Add Fabrice Bellard's JavaScript engine to third party 8f52c0d and get it to pass test262 8a91518
- System calls now return EFAULT in ASAN mode if memory is invalid 690be54
- Add SQLite to third party (thanks @ahgamut) #162 221817e
- Add sendmsg and recvmsg (thanks @fabriziobertocci) #148
- Added LaunchBrowser API to redbean (thanks @Rotario) #153
- Wide character classification now supports UNICODE 1b5a571
- Add syslog (thanks @fabriziobertocci) #136
- Add strxfrm (thanks @ahgamut) #160
- Add struct ip_mreq (thanks @fabriziobertocci) #143
- Add MacOS toolchain instructions (thanks @d4tocchini) #163
- Add 14 missing system call prototypes (thanks @dosisod) #142
- Improve consts.sh magnums bf03b2e b107d27 1b5a571 690be54
- Fix stdio in cases where it overflows kernel tty buffer b107d27
- Improve backwards compatibility with GNU Make 1f2288b
- Fix GDB attach on crash w/ OpenBSD msyscall() bf03b2e
- Remove undefined behaviors b383817
- Add TUI paneling example 26ac687
- Add netcat clone b107d27 4864565
- Improve rusage accounting apis bf03b2e
Getting Started
If you're doing your development work on Linux or BSD then you need just five files to get started. Here's what you do on Linux:
wget https://justine.lol/cosmopolitan/cosmopolitan-amalgamation-1.0.zip
unzip cosmopolitan-amalgamation-1.0.zip
printf 'main() { printf("hello world\\n"); }\n' >hello.c
gcc -g -Os -static -nostdlib -nostdinc -fno-pie -no-pie -mno-red-zone \
-fno-omit-frame-pointer -pg -mnop-mcount \
-o hello.com.dbg hello.c -fuse-ld=bfd -Wl,-T,ape.lds \
-include cosmopolitan.h crt.o ape.o cosmopolitan.a
objcopy -S -O binary hello.com.dbg hello.com
You now have a portable program. Please note that your APE binary will assimilate itself as a conventional resident of your platform after the first run, so it can be fast and efficient for subsequent executions.
./hello.com
bash -c './hello.com' # zsh/fish workaround (we upstreamed patches)
So if you intend to copy the binary to Windows or Mac then please do that before you run it, not after.
If you're developing on MacOS you can install the GNU compiler collection for x86_64-elf via homebrew:
brew install x86_64-elf-gcc
Then in the above scripts just replace gcc
and objcopy
with x86_64-elf-gcc
and x86_64-elf-objcopy
to compile your APE binary.
If you're developing on Windows then you need to download an x86_64-pc-linux-gnu toolchain beforehand. See the Compiling on Windows tutorial. It's needed because the ELF object format is what makes universal binaries possible.
Cosmopolitan can also be compiled from source on any Linux distro.
wget https://justine.lol/cosmopolitan/cosmopolitan-1.0.tar.gz
tar xf cosmopolitan-1.0.tar.gz # see releases page
cd cosmopolitan
make -j8 # should take ~30 seconds
o//examples/hello.com
o/third_party/lua/lua.com -e 'print(2 + 2)'
o/third_party/quickjs/qjs.com -e 'console.log(2+2)'
echo select 2 + 2 | o/third_party/sqlite3/sqlite3.com
printf 'GET /404.html\n\n' | o//examples/nc.com redbean.justine.lol 80
o//tool/viz/life.com
Contributing
We have automated Travis CI testing. Any pull request you send is going to get feedback in 2 minutes and 16 seconds. That's how long Travis CI takes to test this whole repository, which builds 14,507 objects, 68 libraries, and 461 static executables, 289 of which are test executables which are run too. On a real PC, building and testing everything from scratch takes 34 seconds instead of two minutes. If the hostnames freebsd, openbsd, netbsd, rhel7, rhel5, xnu, win7, and win10 can be ssh'd into, then make test -j8
takes 15 additional seconds to deploy and run all 300 test executables on those operating systems too. See CONTRIBUTING.md for further details.
Support Vector
Platform | Min Version | Circa |
---|---|---|
AMD | K8 Venus | 2005 |
Intel | Core | 2006 |
New Technology | Vista | 2006 |
GNU/Systemd | 2.6.18 | 2007 |
XNU's Not UNIX! | 15.6 | 2018 |
FreeBSD | 12 | 2018 |
OpenBSD | 6.4 | 2018 |
NetBSD | 9.1 | 2020 |
GNU Make | 3.80 | 2010 |
Cosmopolitan v0.3
Cosmopolitan Libc makes C a build-once run-anywhere language, like Java, except it doesn't need an interpreter or virtual machine. Instead, it reconfigures stock GCC and Clang to output a POSIX-approved polyglot format that runs natively on Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS with the best possible performance and the tiniest footprint imaginable.
This release adds features such as Lua server pages to redbean (which last month became the third most popular "Show HN" thread). There's been a number of performance enhancements, improvements to compatibility, and bug fixes. We also managed to port several high-level languages to Cosmopolitan with passing test suites. This project has also received its first thirty sponsors. Thank you for your support!
Changes
- Major improvements to redbean 09bcfa2 4d21cd3 dcbd2b8 a1677d6 3c19b6e 1753b66
- Major improvements to stdio da36e7e c3ed8d6 aad8416
- Add socketpair thanks to @fabriziobertocci ca88ce5
- Numerous bug fixes, thanks to @alisonatwork 9c81729 6cd1037 8a6ac6d f5da4ef 813e11b 5d334b9
- Add missing math functions, and fix isystem headers, thanks to @dosisod 8a23643 fb7b7c6
- Fix APE error if unable to modify self, thanks to @tomberek 0eaad9d
- UEFI support 537c213
- Support proper %g, %f, and %a float formatting f064183
- Add posix_spawn 5ce83b0
- Make pow() conform to standard definition 8af91bc 43b2475
Getting Started
If you're doing your development work on Linux or BSD then you need just five files to get started. Here's what you do on Linux:
wget https://justine.lol/cosmopolitan/cosmopolitan-amalgamation-0.3.zip
unzip cosmopolitan-amalgamation-0.3.zip
printf 'main() { printf("hello world\\n"); }\n' >hello.c
gcc -g -Os -static -nostdlib -nostdinc -fno-pie -no-pie -mno-red-zone \
-fno-omit-frame-pointer -pg -mnop-mcount \
-o hello.com.dbg hello.c -fuse-ld=bfd -Wl,-T,ape.lds \
-include cosmopolitan.h crt.o ape.o cosmopolitan.a
objcopy -S -O binary hello.com.dbg hello.com
You now have a portable program. Please note that your APE binary will assimilate itself as a conventional resident of your platform after the first run, so it can be fast and efficient for subsequent executions.
./hello.com
bash -c './hello.com' # zsh/fish workaround (we upstreamed a patch)
So if you intend to copy the binary to Windows or Mac then please do that before you run it, not after.
If you're developing on Windows or MacOS then you need to download an x86_64-pc-linux-gnu toolchain beforehand. See the Compiling on Windows tutorial. It's needed because the ELF object format is what makes universal binaries possible.
Cosmopolitan can also be compiled from source on any Linux distro.
wget https://justine.lol/cosmopolitan/cosmopolitan-0.3.tar.gz
tar xf cosmopolitan-0.3.tar.gz # see releases page
cd cosmopolitan
make -j16
o//examples/hello.com
find o -name \*.com | xargs ls -rShal | less
Contributing
We now have automated Travis CI testing. That means any pull request you send is going to get feedback in two minutes, which is how long it takes to build and test this whole repository inside a tiny VM.
Support Vector
Platform | Min Version | Circa |
---|---|---|
AMD | K8 Venus | 2005 |
Intel | Core | 2006 |
New Technology | Vista | 2006 |
GNU/Systemd | 2.6.18 | 2007 |
XNU's Not UNIX! | 15.6 | 2018 |
FreeBSD | 12 | 2018 |
OpenBSD | 6.4 | 2018 |
NetBSD | 9.1 | 2020 |