2021-02-04 11:30:47 +00:00
|
|
|
|
![Cosmopolitan Honeybadger](usr/share/img/honeybadger.png)
|
|
|
|
|
|
2022-06-23 20:22:28 +00:00
|
|
|
|
[![build](https://github.com/jart/cosmopolitan/actions/workflows/build.yml/badge.svg)](https://github.com/jart/cosmopolitan/actions/workflows/build.yml)
|
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
|
|
|
|
|
|
2023-06-17 14:55:48 +00:00
|
|
|
|
It's recommended that Cosmopolitan be installed to `/opt/cosmo` and
|
|
|
|
|
`/opt/cosmos` on your computer. The first has the monorepo. The second
|
|
|
|
|
contains your non-monorepo artifacts.
|
2021-01-29 00:19:10 +00:00
|
|
|
|
|
2023-07-25 03:15:18 +00:00
|
|
|
|
```sh
|
2023-06-17 14:55:48 +00:00
|
|
|
|
sudo mkdir -p /opt
|
|
|
|
|
sudo chmod 1777 /opt
|
|
|
|
|
git clone https://github.com/jart/cosmopolitan /opt/cosmo
|
2023-06-17 17:13:50 +00:00
|
|
|
|
cd /opt/cosmo
|
|
|
|
|
make -j8 toolchain
|
|
|
|
|
ape/apeinstall.sh # optional
|
2023-06-17 14:55:48 +00:00
|
|
|
|
mkdir -p /opt/cosmos/bin
|
|
|
|
|
export PATH="/opt/cosmos/bin:$PATH"
|
|
|
|
|
echo 'PATH="/opt/cosmos/bin:$PATH"' >>~/.profile
|
|
|
|
|
sudo ln -sf /opt/cosmo/tool/scripts/cosmocc /opt/cosmos/bin/cosmocc
|
|
|
|
|
sudo ln -sf /opt/cosmo/tool/scripts/cosmoc++ /opt/cosmos/bin/cosmoc++
|
2021-03-04 15:54:41 +00:00
|
|
|
|
```
|
|
|
|
|
|
2023-06-17 14:55:48 +00:00
|
|
|
|
You've now successfully installed your very own cosmos. Now let's build
|
|
|
|
|
an example program, which demonstrates the crash reporting feature:
|
2021-03-04 15:54:41 +00:00
|
|
|
|
|
2023-06-17 14:55:48 +00:00
|
|
|
|
```c
|
|
|
|
|
// hello.c
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <cosmo.h>
|
|
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
|
ShowCrashReports();
|
|
|
|
|
printf("hello world\n");
|
|
|
|
|
__builtin_trap();
|
|
|
|
|
}
|
2021-02-08 17:19:00 +00:00
|
|
|
|
```
|
|
|
|
|
|
2023-06-17 14:55:48 +00:00
|
|
|
|
To compile the program, you can run the `cosmocc` command. It's
|
|
|
|
|
important to give it an output path that ends with `.com` so the output
|
|
|
|
|
format will be Actually Portable Executable. When this happens, a
|
|
|
|
|
concomitant debug binary is created automatically too.
|
2022-09-04 07:09:24 +00:00
|
|
|
|
|
2023-07-25 03:15:18 +00:00
|
|
|
|
```sh
|
2023-06-17 14:55:48 +00:00
|
|
|
|
cosmocc -o hello.com hello.c
|
|
|
|
|
./hello.com
|
|
|
|
|
./hello.com.dbg
|
2022-09-04 07:09:24 +00:00
|
|
|
|
```
|
|
|
|
|
|
2023-06-17 14:55:48 +00:00
|
|
|
|
You can use the `cosmocc` toolchain to build conventional open source
|
|
|
|
|
projects which use autotools. This strategy normally works:
|
2022-09-04 07:09:24 +00:00
|
|
|
|
|
2023-07-25 03:15:18 +00:00
|
|
|
|
```sh
|
2023-06-17 14:55:48 +00:00
|
|
|
|
export CC=cosmocc
|
|
|
|
|
export CXX=cosmoc++
|
|
|
|
|
./configure --prefix=/opt/cosmos
|
|
|
|
|
make -j
|
|
|
|
|
make install
|
2022-09-04 07:09:24 +00:00
|
|
|
|
```
|
|
|
|
|
|
2023-06-17 14:55:48 +00:00
|
|
|
|
The Cosmopolitan Libc runtime links some heavyweight troubleshooting
|
|
|
|
|
features by default, which are very useful for developers and admins.
|
|
|
|
|
Here's how you can log system calls:
|
2022-12-22 07:00:51 +00:00
|
|
|
|
|
2023-07-25 03:15:18 +00:00
|
|
|
|
```sh
|
2023-06-17 14:55:48 +00:00
|
|
|
|
./hello.com --strace
|
|
|
|
|
```
|
2022-05-24 17:19:39 +00:00
|
|
|
|
|
2023-06-17 14:55:48 +00:00
|
|
|
|
Here's how you can get a much more verbose log of function calls:
|
2022-05-24 17:19:39 +00:00
|
|
|
|
|
2023-07-25 03:15:18 +00:00
|
|
|
|
```sh
|
2023-06-17 14:55:48 +00:00
|
|
|
|
./hello.com --ftrace
|
2022-05-24 17:19:39 +00:00
|
|
|
|
```
|
|
|
|
|
|
2023-06-17 14:55:48 +00:00
|
|
|
|
If you want to cut out the bloat and instead make your executables as
|
|
|
|
|
tiny as possible, then the monorepo supports numerous build modes. You
|
|
|
|
|
can select one of the predefined ones by looking at
|
|
|
|
|
[build/config.mk](build/config.mk). One of the most popular modes is
|
|
|
|
|
`MODE=tiny`. It can be used with the `cosmocc` toolchain as follows:
|
2022-05-24 17:19:39 +00:00
|
|
|
|
|
2023-07-25 03:15:18 +00:00
|
|
|
|
```sh
|
2023-06-17 14:55:48 +00:00
|
|
|
|
cd /opt/cosmo
|
|
|
|
|
make -j8 MODE=tiny toolchain
|
2022-05-24 17:19:39 +00:00
|
|
|
|
```
|
|
|
|
|
|
2023-06-17 14:55:48 +00:00
|
|
|
|
Now that we have our toolchain, let's write a program that links less
|
|
|
|
|
surface area than the program above. The executable that this program
|
|
|
|
|
produces will run on platforms like Linux, Windows, MacOS, etc., even
|
|
|
|
|
though it's directly using POSIX APIs, which Cosmopolitan polyfills.
|
|
|
|
|
|
|
|
|
|
```c
|
|
|
|
|
// hello2.c
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
int main() {
|
|
|
|
|
write(1, "hello world\n", 12);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Now let's compile our tiny actually portable executable, which should be
|
|
|
|
|
on the order of 20kb in size.
|
2022-05-24 17:19:39 +00:00
|
|
|
|
|
2023-07-25 03:15:18 +00:00
|
|
|
|
```sh
|
2023-06-17 14:55:48 +00:00
|
|
|
|
export MODE=tiny
|
|
|
|
|
cosmocc -Os -o hello2.com hello2.c
|
|
|
|
|
./hello2.com
|
2022-05-24 17:19:39 +00:00
|
|
|
|
```
|
|
|
|
|
|
2023-06-17 14:55:48 +00:00
|
|
|
|
Let's say you only care about Linux and would rather have simpler tinier
|
|
|
|
|
binaries, similar to what Musl Libc would produce. In that case, try
|
|
|
|
|
using the `MODE=tinylinux` build mode, which can produce binaries more
|
|
|
|
|
on the order of 4kb.
|
2022-07-10 21:13:45 +00:00
|
|
|
|
|
2023-07-25 03:15:18 +00:00
|
|
|
|
```sh
|
2023-06-17 14:55:48 +00:00
|
|
|
|
export MODE=tinylinux
|
|
|
|
|
(cd /opt/cosmo; make -j8 toolchain)
|
|
|
|
|
cosmocc -Os -o hello2.com hello2.c
|
|
|
|
|
./hello2.com # <-- actually an ELF executable
|
2022-07-10 21:13:45 +00:00
|
|
|
|
```
|
|
|
|
|
|
2023-06-17 14:55:48 +00:00
|
|
|
|
## ARM
|
2021-03-04 15:54:41 +00:00
|
|
|
|
|
2023-06-17 14:55:48 +00:00
|
|
|
|
Cosmo supports cross-compiling binaries for machines with ARM
|
|
|
|
|
microprocessors. There are two options available for doing this.
|
2021-05-07 14:52:32 +00:00
|
|
|
|
|
2023-06-17 14:55:48 +00:00
|
|
|
|
The first option is to embed the [blink virtual
|
|
|
|
|
machine](https://github.com/jart/blink) by adding the following to the
|
|
|
|
|
top of your main.c file:
|
2021-05-07 14:52:32 +00:00
|
|
|
|
|
2023-06-17 14:55:48 +00:00
|
|
|
|
```c
|
2023-07-26 20:54:49 +00:00
|
|
|
|
__static_yoink("blink_linux_aarch64"); // for raspberry pi
|
|
|
|
|
__static_yoink("blink_xnu_aarch64"); // is apple silicon
|
2021-05-07 14:52:32 +00:00
|
|
|
|
```
|
|
|
|
|
|
2023-06-17 14:55:48 +00:00
|
|
|
|
The benefit is you'll have single file executables that'll run on both
|
|
|
|
|
x86_64 and arm64 platforms. The tradeoff is Blink's JIT is slower than
|
|
|
|
|
running natively, but tends to go fast enough, unless you're doing
|
|
|
|
|
scientific computing (e.g. running LLMs with
|
|
|
|
|
`o//third_party/ggml/llama.com`).
|
2021-05-07 14:52:32 +00:00
|
|
|
|
|
2023-06-17 14:55:48 +00:00
|
|
|
|
Therefore, the second option is to cross compile aarch64 executables,
|
|
|
|
|
by using build modes like the following:
|
2021-05-07 14:52:32 +00:00
|
|
|
|
|
2023-07-25 03:15:18 +00:00
|
|
|
|
```sh
|
2023-06-17 14:55:48 +00:00
|
|
|
|
make -j8 m=aarch64 o/aarch64/third_party/ggml/llama.com
|
|
|
|
|
make -j8 m=aarch64-tiny o/aarch64-tiny/third_party/ggml/llama.com
|
|
|
|
|
```
|
2021-02-08 17:19:00 +00:00
|
|
|
|
|
2023-06-17 14:55:48 +00:00
|
|
|
|
That'll produce ELF executables that run natively on two operating
|
|
|
|
|
systems: Linux Arm64 (e.g. Raspberry Pi) and MacOS Arm64 (i.e. Apple
|
|
|
|
|
Silicon), thus giving you full performance. The catch is you have to
|
|
|
|
|
compile these executables on an x86_64-linux machine. The second catch
|
|
|
|
|
is that MacOS needs a little bit of help understanding the ELF format.
|
|
|
|
|
To solve that, we provide a tiny APE loader you can use on M1 machines.
|
2022-05-25 18:31:08 +00:00
|
|
|
|
|
2023-07-25 03:15:18 +00:00
|
|
|
|
```sh
|
2023-06-17 14:55:48 +00:00
|
|
|
|
scp ape/ape-m1.c macintosh:
|
|
|
|
|
scp o/aarch64/third_party/ggml/llama.com macintosh:
|
|
|
|
|
ssh macintosh
|
|
|
|
|
xcode-install
|
|
|
|
|
cc -o ape ape-m1.c
|
|
|
|
|
sudo cp ape /usr/local/bin/ape
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
You can run your ELF AARCH64 executable on Apple Silicon as follows:
|
|
|
|
|
|
2023-07-25 03:15:18 +00:00
|
|
|
|
```sh
|
2023-06-17 14:55:48 +00:00
|
|
|
|
ape ./llama.com
|
2022-05-25 18:31:08 +00:00
|
|
|
|
```
|
|
|
|
|
|
2021-05-07 14:52:32 +00:00
|
|
|
|
## Source Builds
|
|
|
|
|
|
2022-05-25 18:31:08 +00:00
|
|
|
|
Cosmopolitan can be compiled from source on any Linux distro. First, you
|
|
|
|
|
need to download or clone the repository.
|
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
|
2022-05-25 18:31:08 +00:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
This will build the entire repository and run all the tests:
|
|
|
|
|
|
|
|
|
|
```sh
|
2022-09-13 11:14:20 +00:00
|
|
|
|
build/bootstrap/make.com
|
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-05-25 18:31:08 +00:00
|
|
|
|
If you get an error running make.com then it's probably because you have
|
|
|
|
|
WINE installed to `binfmt_misc`. You can fix that by installing the the
|
|
|
|
|
APE loader as an interpreter. It'll improve build performance too!
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
ape/apeinstall.sh
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Since the Cosmopolitan repository is very large, you might only want to
|
|
|
|
|
build a particular thing. Cosmopolitan's build config does a good job at
|
|
|
|
|
having minimal deterministic builds. For example, if you wanted to build
|
|
|
|
|
only hello.com then you could do that as follows:
|
|
|
|
|
|
|
|
|
|
```sh
|
2022-09-13 11:14:20 +00:00
|
|
|
|
build/bootstrap/make.com o//examples/hello.com
|
2022-05-25 18:31:08 +00:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Sometimes it's desirable to build a subset of targets, without having to
|
|
|
|
|
list out each individual one. You can do that by asking make to build a
|
|
|
|
|
directory name. For example, if you wanted to build only the targets and
|
|
|
|
|
subtargets of the chibicc package including its tests, you would say:
|
|
|
|
|
|
|
|
|
|
```sh
|
2022-09-13 11:14:20 +00:00
|
|
|
|
build/bootstrap/make.com o//third_party/chibicc
|
2022-05-25 18:31:08 +00:00
|
|
|
|
o//third_party/chibicc/chibicc.com --help
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Cosmopolitan provides a variety of build modes. For example, if you want
|
|
|
|
|
really tiny binaries (as small as 12kb in size) then you'd say:
|
|
|
|
|
|
|
|
|
|
```sh
|
2022-09-13 11:14:20 +00:00
|
|
|
|
build/bootstrap/make.com m=tiny
|
2022-05-25 18:31:08 +00:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Here's some other build modes you can try:
|
|
|
|
|
|
|
|
|
|
```sh
|
2022-09-13 11:14:20 +00:00
|
|
|
|
build/bootstrap/make.com m=dbg # asan + ubsan + debug
|
|
|
|
|
build/bootstrap/make.com m=asan # production memory safety
|
|
|
|
|
build/bootstrap/make.com m=opt # -march=native optimizations
|
|
|
|
|
build/bootstrap/make.com m=rel # traditional release binaries
|
|
|
|
|
build/bootstrap/make.com m=optlinux # optimal linux-only performance
|
|
|
|
|
build/bootstrap/make.com m=fastbuild # build 28% faster w/o debugging
|
|
|
|
|
build/bootstrap/make.com m=tinylinux # tiniest linux-only 4kb binaries
|
2022-05-25 18:31:08 +00:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
For further details, see [//build/config.mk](build/config.mk).
|
|
|
|
|
|
2023-06-17 14:55:48 +00:00
|
|
|
|
## Cosmopolitan Amalgamation
|
|
|
|
|
|
|
|
|
|
Another way to use Cosmopolitan is via our amalgamated release, where
|
|
|
|
|
we've combined everything into a single static archive and a single
|
|
|
|
|
header file. 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:
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
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 \
|
|
|
|
|
-fno-omit-frame-pointer -pg -mnop-mcount -mno-tls-direct-seg-refs -gdwarf-4 \
|
|
|
|
|
-o hello.com.dbg hello.c -fuse-ld=bfd -Wl,-T,ape.lds -Wl,--gc-sections \
|
2023-07-01 12:10:12 +00:00
|
|
|
|
-Wl,-z,common-page-size=0x1000 -Wl,-z,max-page-size=0x1000 \
|
2023-06-17 14:55:48 +00:00
|
|
|
|
-include cosmopolitan.h crt.o ape-no-modify-self.o cosmopolitan.a
|
|
|
|
|
objcopy -S -O binary hello.com.dbg hello.com
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
You now have a portable program.
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
./hello.com
|
|
|
|
|
bash -c './hello.com' # zsh/fish workaround (we patched them in 2021)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
If `./hello.com` executed on Linux throws an error about not finding an
|
|
|
|
|
interpreter, it should be fixed by running the following command (although
|
|
|
|
|
note that it may not survive a system restart):
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
sudo sh -c "echo ':APE:M::MZqFpD::/bin/sh:' >/proc/sys/fs/binfmt_misc/register"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
If the same command produces puzzling errors on WSL or WINE when using
|
|
|
|
|
Redbean 2.x, they may be fixed by disabling binfmt_misc:
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
sudo sh -c 'echo -1 >/proc/sys/fs/binfmt_misc/status'
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Since we used the `ape-no-modify-self.o` bootloader (rather than
|
|
|
|
|
`ape.o`) your executable will not modify itself when it's run. What
|
|
|
|
|
it'll instead do, is extract a 4kb program (the [APE loader](https://justine.lol/apeloader/))
|
|
|
|
|
to `${TMPDIR:-${HOME:-.}}` that maps your program into memory without
|
|
|
|
|
needing to copy it. The APE loader must be in an executable location
|
|
|
|
|
(e.g. not stored on a `noexec` mount) for it to run. See below for
|
|
|
|
|
alternatives:
|
|
|
|
|
|
|
|
|
|
It's possible to install the APE loader systemwide as follows.
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
# System-Wide APE Install
|
|
|
|
|
# for Linux, Darwin, and BSDs
|
|
|
|
|
# 1. Copies APE Loader to /usr/bin/ape
|
|
|
|
|
# 2. Registers w/ binfmt_misc too if Linux
|
|
|
|
|
ape/apeinstall.sh
|
|
|
|
|
|
|
|
|
|
# System-Wide APE Uninstall
|
|
|
|
|
# for Linux, Darwin, and BSDs
|
|
|
|
|
ape/apeuninstall.sh
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
It's also possible to convert APE binaries into the system-local format
|
|
|
|
|
by using the `--assimilate` flag. Please note that if binfmt_misc is in
|
|
|
|
|
play, you'll need to unregister it temporarily before doing this, since
|
|
|
|
|
the assimilate feature is part of the shell script header.
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
$ file hello.com
|
|
|
|
|
hello.com: DOS/MBR boot sector
|
|
|
|
|
./hello.com --assimilate
|
|
|
|
|
$ file hello.com
|
|
|
|
|
hello.com: ELF 64-bit LSB executable
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Now that you're up and running with Cosmopolitan Libc and APE, here's
|
|
|
|
|
some of the most important troubleshooting tools APE offers that you
|
|
|
|
|
should know, in case you encounter any issues:
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
./hello.com --strace # log system calls to stderr
|
|
|
|
|
./hello.com --ftrace # log function calls to stderr
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Do you love tiny binaries? If so, you may not be happy with Cosmo adding
|
|
|
|
|
heavyweight features like tracing to your binaries by default. In that
|
|
|
|
|
case, you may want to consider using our build system:
|
|
|
|
|
|
|
|
|
|
```sh
|
|
|
|
|
make m=tiny
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Which will cause programs such as `hello.com` and `life.com` to shrink
|
|
|
|
|
from 60kb in size to about 16kb. There's also a prebuilt amalgamation
|
|
|
|
|
online <https://justine.lol/cosmopolitan/cosmopolitan-tiny.zip> hosted
|
|
|
|
|
on our download page <https://justine.lol/cosmopolitan/download.html>.
|
|
|
|
|
|
2022-04-17 19:25:10 +00:00
|
|
|
|
## GDB
|
|
|
|
|
|
|
|
|
|
Here's the recommended `~/.gdbinit` config:
|
|
|
|
|
|
2022-09-04 05:19:55 +00:00
|
|
|
|
```gdb
|
2022-04-17 19:25:10 +00:00
|
|
|
|
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
|
|
|
|
|
|
2023-07-25 03:15:18 +00:00
|
|
|
|
```sh
|
2022-04-17 19:25:10 +00:00
|
|
|
|
gdb foo.com -ex 'add-symbol-file foo.com.dbg 0x401000'
|
|
|
|
|
```
|
|
|
|
|
|
2023-06-17 14:55:48 +00:00
|
|
|
|
## Alternative Development Environments
|
|
|
|
|
|
|
|
|
|
### 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
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
Cosmopolitan officially only builds on Linux. However, one highly
|
|
|
|
|
experimental (and currently broken) thing you could try, is building the
|
|
|
|
|
entire cosmo repository from source using the cross9 toolchain.
|
|
|
|
|
|
2023-07-25 03:15:18 +00:00
|
|
|
|
```sh
|
2023-06-17 14:55:48 +00:00
|
|
|
|
mkdir -p o/third_party
|
|
|
|
|
rm -rf o/third_party/gcc
|
|
|
|
|
wget https://justine.lol/linux-compiler-on-windows/cross9.zip
|
|
|
|
|
unzip cross9.zip
|
|
|
|
|
mv cross9 o/third_party/gcc
|
|
|
|
|
build/bootstrap/make.com
|
|
|
|
|
```
|
|
|
|
|
|
2023-03-30 17:49:04 +00:00
|
|
|
|
## Discord Chatroom
|
|
|
|
|
|
|
|
|
|
The Cosmopolitan development team collaborates on the Redbean Discord
|
2023-03-30 22:42:58 +00:00
|
|
|
|
server. You're welcome to join us! <https://discord.gg/FwAVVu7eJ4>
|
2023-03-30 17:49:04 +00:00
|
|
|
|
|
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 |
|
2022-07-19 23:05:19 +00:00
|
|
|
|
| Linux | 2.6.18 | 2007 |
|
2022-11-02 13:49:42 +00:00
|
|
|
|
| Windows | 8 [1] | 2012 |
|
2022-07-19 23:05:19 +00:00
|
|
|
|
| Mac OS X | 15.6 | 2018 |
|
2023-07-01 12:10:12 +00:00
|
|
|
|
| OpenBSD | 7 | 2021 |
|
2022-09-15 10:49:34 +00:00
|
|
|
|
| FreeBSD | 13 | 2020 |
|
2022-06-11 16:27:14 +00:00
|
|
|
|
| NetBSD | 9.2 | 2021 |
|
2022-06-22 11:35:43 +00:00
|
|
|
|
|
2022-11-02 13:49:42 +00:00
|
|
|
|
[1] See our [vista branch](https://github.com/jart/cosmopolitan/tree/vista)
|
|
|
|
|
for a community supported version of Cosmopolitan that works on Windows
|
|
|
|
|
Vista and Windows 7.
|
|
|
|
|
|
2022-06-22 11:35:43 +00:00
|
|
|
|
## Special Thanks
|
|
|
|
|
|
|
|
|
|
Funding for this project is crowdsourced using
|
|
|
|
|
[GitHub Sponsors](https://github.com/sponsors/jart) and
|
|
|
|
|
[Patreon](https://www.patreon.com/jart). Your support is what makes this
|
|
|
|
|
project possible. Thank you! We'd also like to give special thanks to
|
2022-09-28 02:00:11 +00:00
|
|
|
|
the following groups and individuals:
|
2022-06-22 11:35:43 +00:00
|
|
|
|
|
|
|
|
|
- [Joe Drumgoole](https://github.com/jdrumgoole)
|
2022-09-28 01:17:22 +00:00
|
|
|
|
- [Rob Figueiredo](https://github.com/robfig)
|
2022-09-28 02:00:11 +00:00
|
|
|
|
- [Wasmer](https://wasmer.io/)
|
2022-06-22 11:35:43 +00:00
|
|
|
|
|
|
|
|
|
For publicly sponsoring our work at the highest tier.
|