2021-02-04 11:30:47 +00:00
|
|
|
|
![Cosmopolitan Honeybadger](usr/share/img/honeybadger.png)
|
|
|
|
|
|
2020-06-15 14:18:57 +00:00
|
|
|
|
# Cosmopolitan
|
|
|
|
|
|
2021-01-29 00:19:10 +00:00
|
|
|
|
[Cosmopolitan Libc](https://justine.lol/cosmopolitan/index.html) makes C
|
|
|
|
|
a build-once run-anywhere language, like Java, except it doesn't need an
|
2021-02-08 17:19:00 +00:00
|
|
|
|
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.
|
2021-01-29 00:19:10 +00:00
|
|
|
|
|
|
|
|
|
## Background
|
|
|
|
|
|
|
|
|
|
For an introduction to this project, please read the [αcτµαlly pδrταblε
|
|
|
|
|
εxεcµταblε](https://justine.lol/ape.html) blog post and [cosmopolitan
|
|
|
|
|
libc](https://justine.lol/cosmopolitan/index.html) website. We also have
|
|
|
|
|
[API documentation](https://justine.lol/cosmopolitan/documentation.html).
|
|
|
|
|
|
|
|
|
|
## Getting Started
|
|
|
|
|
|
2021-02-08 17:19:00 +00:00
|
|
|
|
If you're doing your development work on Linux or BSD then you need just
|
2021-03-04 15:54:41 +00:00
|
|
|
|
five files to get started. Here's what you do on Linux:
|
2021-01-29 00:19:10 +00:00
|
|
|
|
|
|
|
|
|
```sh
|
2022-04-06 19:55:14 +00:00
|
|
|
|
wget https://justine.lol/cosmopolitan/cosmopolitan.zip
|
|
|
|
|
unzip cosmopolitan.zip
|
2021-02-19 00:32:31 +00:00
|
|
|
|
printf 'main() { printf("hello world\\n"); }\n' >hello.c
|
2021-03-04 14:13:32 +00:00
|
|
|
|
gcc -g -Os -static -nostdlib -nostdinc -fno-pie -no-pie -mno-red-zone \
|
2021-03-03 21:38:30 +00:00
|
|
|
|
-fno-omit-frame-pointer -pg -mnop-mcount \
|
2021-02-08 17:19:00 +00:00
|
|
|
|
-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
|
2021-03-04 15:54:41 +00:00
|
|
|
|
```
|
|
|
|
|
|
2021-03-04 21:22:32 +00:00
|
|
|
|
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.
|
2021-03-04 15:54:41 +00:00
|
|
|
|
|
|
|
|
|
```sh
|
2021-02-08 17:19:00 +00:00
|
|
|
|
./hello.com
|
2021-05-17 03:34:46 +00:00
|
|
|
|
bash -c './hello.com' # zsh/fish workaround (we upstreamed patches)
|
2021-02-08 17:19:00 +00:00
|
|
|
|
```
|
|
|
|
|
|
2021-03-04 15:54:41 +00:00
|
|
|
|
So if you intend to copy the binary to Windows or Mac then please do
|
|
|
|
|
that before you run it, not after.
|
|
|
|
|
|
2021-05-07 14:52:32 +00:00
|
|
|
|
### MacOS
|
|
|
|
|
|
|
|
|
|
If you're developing on MacOS you can install the GNU compiler
|
|
|
|
|
collection for x86_64-elf via homebrew:
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
### Windows
|
|
|
|
|
|
|
|
|
|
If you're developing on Windows then you need to download an
|
2021-02-08 17:19:00 +00:00
|
|
|
|
x86_64-pc-linux-gnu toolchain beforehand. See the [Compiling on
|
|
|
|
|
Windows](https://justine.lol/cosmopolitan/windows-compiling.html)
|
|
|
|
|
tutorial. It's needed because the ELF object format is what makes
|
|
|
|
|
universal binaries possible.
|
|
|
|
|
|
2021-05-07 14:52:32 +00:00
|
|
|
|
## Source Builds
|
|
|
|
|
|
|
|
|
|
Cosmopolitan can be compiled from source on any Linux distro. GNU make
|
|
|
|
|
needs to be installed beforehand. This is a freestanding hermetic
|
|
|
|
|
repository that bootstraps using a vendored static gcc9 executable.
|
|
|
|
|
No further dependencies are required.
|
2021-02-08 17:19:00 +00:00
|
|
|
|
|
|
|
|
|
```sh
|
2022-04-06 20:07:51 +00:00
|
|
|
|
wget https://justine.lol/cosmopolitan/cosmopolitan.tar.gz
|
|
|
|
|
tar xf cosmopolitan.tar.gz # see releases page
|
2021-03-29 10:15:30 +00:00
|
|
|
|
cd cosmopolitan
|
2021-02-07 14:11:44 +00:00
|
|
|
|
make -j16
|
2021-01-29 00:19:10 +00:00
|
|
|
|
o//examples/hello.com
|
2021-02-07 14:11:44 +00:00
|
|
|
|
find o -name \*.com | xargs ls -rShal | less
|
2021-01-29 00:19:10 +00:00
|
|
|
|
```
|
2021-03-01 00:40:36 +00:00
|
|
|
|
|
2022-04-17 19:25:10 +00:00
|
|
|
|
## GDB
|
|
|
|
|
|
|
|
|
|
Here's the recommended `~/.gdbinit` config:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
set host-charset UTF-8
|
|
|
|
|
set target-charset UTF-8
|
|
|
|
|
set target-wide-charset UTF-8
|
|
|
|
|
set osabi none
|
|
|
|
|
set complaints 0
|
|
|
|
|
set confirm off
|
|
|
|
|
set history save on
|
|
|
|
|
set history filename ~/.gdb_history
|
|
|
|
|
define asm
|
|
|
|
|
layout asm
|
|
|
|
|
layout reg
|
|
|
|
|
end
|
|
|
|
|
define src
|
|
|
|
|
layout src
|
|
|
|
|
layout reg
|
|
|
|
|
end
|
|
|
|
|
src
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
You normally run the `.com.dbg` file under gdb. If you need to debug the
|
|
|
|
|
`.com` file itself, then you can load the debug symbols independently as
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
gdb foo.com -ex 'add-symbol-file foo.com.dbg 0x401000'
|
|
|
|
|
```
|
|
|
|
|
|
2021-03-01 00:40:36 +00:00
|
|
|
|
## Support Vector
|
|
|
|
|
|
2021-03-04 14:13:32 +00:00
|
|
|
|
| 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 |
|
2021-10-14 00:27:13 +00:00
|
|
|
|
| GNU Make | 4.0 | 2015 |
|