cosmopolitan - build-once run-anywhere c ライブラリ

(build-once run-anywhere c library)

Created at: 2020-06-15 22:16:13
Language: C
License: ISC

コスモポリタン ハニーバッジャー

建てる

コスモポリタン

Cosmopolitan Libcは、C を Java のように一度ビルドすればどこでも実行できる言語にしますが、インタープリターや仮想マシンは必要ありません。代わりに、ストック GCC と Clang を再構成して、Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS でネイティブに実行される POSIX 承認の多言語フォーマットを出力し、可能な限り最高のパフォーマンスと最小のフットプリントを実現します。

バックグラウンド

このプロジェクトの紹介については、αcτµαlly pδrταblεxεcµταblεブログ投稿とコスモポリタンな libc Web サイトをお読みください。API ドキュメントもあり ます。

入門

Linux または BSD で開発作業を行っている場合、開始するために必要なファイルは 5 つだけです。Linux で行うことは次のとおりです。

wget https://justine.lol/cosmopolitan/cosmopolitan-amalgamation-2.0.1.zip
unzip cosmopolitan-amalgamation-2.0.1.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

これで移植可能なプログラムができました。

./hello.com
bash -c './hello.com'  # zsh/fish workaround (we patched them in 2021)

./hello.com
Linux で実行すると、インタープリターが見つからないというエラーがスローされた場合、次のコマンドを実行して修正する必要があります (ただし、システムの再起動後は存続しない可能性があることに注意してください)。

sudo sh -c "echo ':APE:M::MZqFpD::/bin/sh:' >/proc/sys/fs/binfmt_misc/register"

Redbean 2.x を使用しているときに同じコマンドが WSL または WINE で不可解なエラーを生成する場合は、binfmt_misc を無効にすることで修正される可能性があります。

sudo sh -c 'echo -1 >/proc/sys/fs/binfmt_misc/status'

ape-no-modify-self.o
(ではなく)ブートローダー を使用したため
ape.o
、実行可能ファイルは実行時にそれ自体を変更しません。
${TMPDIR:-${HOME:-.}}
代わりに行うことは、プログラムをコピーする必要なくメモリにマップする 4kb プログラムを抽出することです。次のようにして、システム全体に APE ローダーをインストールすることができます。

# 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

--assimilate
フラグを使用して、APE バイナリをシステムローカル形式に変換することもできます。binfmt_misc が機能している場合は、同化機能がシェル スクリプト ヘッダーの一部であるため、これを行う前に一時的に登録を解除する必要があることに注意してください。

$ file hello.com
hello.com: DOS/MBR boot sector
./hello.com --assimilate
$ file hello.com
hello.com: ELF 64-bit LSB executable

Cosmopolitan Libc と APE を使用できるようになったので、問題が発生した場合に備えて、APE が提供する最も重要なトラブルシューティング ツールをいくつか紹介します。

./hello.com --strace   # log system calls to stderr
./hello.com --ftrace   # log function calls to stderr

小さなバイナリが好きですか? もしそうなら、デフォルトでバイナリへのトレースのような重い機能を追加する Cosmo に満足できないかもしれません。その場合は、ビルド システムの使用を検討してください。

make -j8 MODE=tiny

これにより、

hello.com
やなどのプログラム
life.com
のサイズが 60kb から約 16kb に縮小されます。ダウンロード ページhttps://justine.lol/cosmopolitan/download.htmlでホストされている事前構築済みの統合オンラインhttps://justine.lol/cosmopolitan/cosmopolitan-tiny.zipもあります。

マックOS

MacOS で開発している場合は、x86_64-elf の GNU コンパイラ コレクションを自作でインストールできます。

brew install x86_64-elf-gcc

次に、上記のスクリプトで

gcc
and
objcopy
x86_64-elf-gcc
andに置き換えて
x86_64-elf-objcopy
、APE バイナリをコンパイルします。

ウィンドウズ

Windows で開発している場合は、事前に x86_64-pc-linux-gnu ツールチェーンをダウンロードする必要があります。Windows でのコンパイルの チュートリアルを参照してください。これが必要なのは、ELF オブジェクト形式がユニバーサル バイナリを可能にするためです。

Cosmopolitan は公式には Linux 上でのみビルドされます。ただし、試すことができる非常に実験的な (そして現在は機能していない) ことの 1 つは、cross9 ツールチェーンを使用してソースから cosmo リポジトリ全体を構築することです。

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

ソースビルド

Cosmopolitan は、どの Linux ディストリビューションでもソースからコンパイルできます。まず、リポジトリをダウンロードまたはクローンする必要があります。

wget https://justine.lol/cosmopolitan/cosmopolitan.tar.gz
tar xf cosmopolitan.tar.gz  # see releases page
cd cosmopolitan

これにより、リポジトリ全体がビルドされ、すべてのテストが実行されます。

build/bootstrap/make.com -j16
o//examples/hello.com
find o -name \*.com | xargs ls -rShal | less

make.com の実行中にエラーが発生した場合は、おそらく WINE が にインストールされているためです

binfmt_misc
。これは、APE ローダーをインタープリターとしてインストールすることで修正できます。ビルドのパフォーマンスも向上します。

ape/apeinstall.sh

Cosmopolitan リポジトリは非常に大きいため、特定のものだけをビルドしたい場合があります。コスモポリタンのビルド構成は、最小限の決定論的ビルドでうまく機能します。たとえば、hello.com のみをビルドする場合は、次のようにします。

build/bootstrap/make.com -j16 o//examples/hello.com

個々のターゲットをリストする必要なく、ターゲットのサブセットを構築することが望ましい場合があります。これを行うには、ディレクトリ名を作成するように make に依頼します。たとえば、テストを含む chibicc パッケージのターゲットとサブターゲットのみをビルドする場合は、次のようにします。

build/bootstrap/make.com -j16 o//third_party/chibicc
o//third_party/chibicc/chibicc.com --help

Cosmopolitan には、さまざまなビルド モードが用意されています。たとえば、非常に小さなバイナリ (サイズが 12kb 程度) が必要な場合は、次のようにします。

build/bootstrap/make.com -j16 MODE=tiny

試すことができる他のビルドモードを次に示します。

build/bootstrap/make.com -j16 MODE=dbg       # asan + ubsan + debug
build/bootstrap/make.com -j16 MODE=asan      # production memory safety
build/bootstrap/make.com -j16 MODE=opt       # -march=native optimizations
build/bootstrap/make.com -j16 MODE=rel       # traditional release binaries
build/bootstrap/make.com -j16 MODE=optlinux  # optimal linux-only performance
build/bootstrap/make.com -j16 MODE=tinylinux # tiniest linux-only 4kb binaries

詳細については、//build/config.mkを参照してください。

GDB

推奨

~/.gdbinit
構成は次のとおりです。

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

通常、

.com.dbg
gdb の下でファイルを実行します。
.com
ファイル自体をデバッグする必要がある場合は 、次のようにデバッグ シンボルを個別に読み込むことができます。

gdb foo.com -ex 'add-symbol-file foo.com.dbg 0x401000'

サポート ベクター

プラットホーム 最小バージョン 年頃
AMD K8ヴィーナス 2005年
インテル 2006年
ウィンドウズ ビスタ 2006年
Linux 2.6.18 2007年
Mac OS X 15.6 2018年
FreeBSD 13 2020年
OpenBSD 6.4 2018年
NetBSD 9.2 2021年

特別な感謝

このプロジェクトの資金は、 GitHub スポンサーPatreonを使用してクラウドソーシングされています。皆様のご支援がこのプロジェクトを可能にしています。ありがとうございました!また、次の方々にも感謝いたします。

最高レベルでの私たちの仕事を公的に後援するため。