ポータブルな実行可能ファイル用に開発された標準 C ライブラリ Cosmopolitan 2.0 のリリース

Cosmopolitan 2.0 プロジェクトのリリースが公開され、インタプリタや仮想マシンを使用せずに、さまざまなオペレーティング システム用のプログラムを配布するために使用できる標準 C ライブラリとユニバーサル実行可能ファイル形式が開発されました。 GCC および Clang でコンパイルして得られた結果は、静的にリンクされたユニバーサル実行可能ファイルにコンパイルされ、Linux ディストリビューション、macOS、Windows、FreeBSD、OpenBSD、NetBSD 上で実行でき、さらに BIOS から呼び出すこともできます。 プロジェクト コードは、ISC ライセンス (MIT/BSD の簡易バージョン) に基づいて配布されます。

ユニバーサル実行可能ファイルを生成するコンテナーは、さまざまなオペレーティング システム (PE、ELF、MACHO、OPENBSD) に固有のセグメントとヘッダーを XNUMX つのファイルに結合することに基づいており、Unix、Windows、macOS で使用されるいくつかの異なる形式を組み合わせます。 単一の実行可能ファイルを Windows および Unix システムで確実に実行するには、Thompson Shell が「#!」スクリプト マーカーを使用しないという事実を利用して、Windows PE ファイルをシェル スクリプトとしてエンコードするという方法があります。 複数のファイルを含むプログラム (すべてのリソースを XNUMX つのファイルにリンク) を作成するために、特別に設計された ZIP アーカイブの形式での実行可能ファイルの形成がサポートされています。 提案された形式のスキーム (hello.com アプリケーションの例):

MZqFpD='BIOS ブート セクター' exec 7 $(command -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" exit 1 REAL MODE… ELF SEGMENTS… OPENBSD Note… MACHO HEADERS… CODE AND DATA… ZIP DIRECTORY…

ファイルの先頭にはラベル「MZqFpD」が示されており、これは Windows PE 形式のヘッダーとして認識されます。 このシーケンスは、命令「pop %r10;」でもデコードされます。 jno 0x4a ; jo 0x4a" と、命令 "jg 177x0" への行 "\47ELF" は、エントリ ポイントに転送するために使用されます。 Unix システムは、exec コマンドを使用するシェル コードを実行し、名前のないパイプを介して実行可能コードを渡します。 提案された方法の制限は、Thompson Shell 互換モードをサポートするシェルを使用してのみ Unix 系オペレーティング システムで実行できることです。

qemu-x86_64 呼び出しにより移植性が向上し、x86_64 アーキテクチャ用にコンパイルされたコードを、Raspberry Pi ボードや ARM プロセッサを搭載した Apple デバイスなどの非 x86 プラットフォームで実行できるようになります。 このプロジェクトを使用して、オペレーティング システム (ベア メタル) なしで実行される自己完結型アプリケーションを作成することもできます。 このようなアプリケーションでは、ブートローダーが実行可能ファイルにアタッチされ、プログラムはブート可能なオペレーティング システムとして機能します。

このプロジェクトによって開発された標準 C ライブラリ libc は 2024 の関数を提供します (最初のリリースでは約 1400 の関数がありました)。 パフォーマンスの点では、Cosmopolitan は glibc と同じくらい高速に動作し、Musl や Newlib よりも著しく優れています。ただし、Cosmopolitan はコード サイズが glibc よりも一桁小さく、Musl および Newlib にほぼ相当します。 memcpy や strlen などの頻繁に呼び出される関数を最適化するために、「トリクルダウン パフォーマンス」手法がさらに使用されます。この手法では、関数の呼び出しにマクロ バインディングが使用され、コードの実行に関与する CPU レジスタについてコンパイラに通知されます。これにより、変更可能なレジスタのみを保存することで CPU 状態を保存するときにリソースを節約できます。

新しいリリースの変更点には次のようなものがあります。

  • zip ファイル内の内部リソースにアクセスするためのスキームが変更されました (ファイルを開くときに、zip:.. プレフィックスを使用する代わりに、通常の /zip/... パスが使用されるようになりました)。 同様に、Windows でディスクにアクセスするには、「C:/...」の代わりに「/c/...」のようなパスを使用できます。
  • 新しい APE (Actually Portable Executable) ローダーが提案されており、ユニバーサル実行可能ファイルの形式を定義します。 新しいローダーは mmap を使用してプログラムをメモリに配置し、その場で内容を変更することはなくなりました。 必要に応じて、ユニバーサル実行可能ファイルを個々のプラットフォームに関連付けられた通常の実行可能ファイルに変換できます。
  • Linux プラットフォームでは、binfmt_misc カーネル モジュールを使用して APE プログラムを実行できます。 binfmt_misc を使用するのが最も速い起動方法であることに注意してください。
  • Linux の場合、OpenBSD プロジェクトによって開発された pledge() および unveil() システム コールの機能の実装が提案されています。 C、C++、Python、Redbean のプログラムでこれらの呼び出しを使用するための API と、任意のプロセスを分離するための pledge.com ユーティリティが提供されています。
  • このビルドでは、Landlock Make ユーティリティを使用します。これは、より厳格な依存関係チェックを備えた GNU Make のエディションであり、Landlock システム コールを使用してプログラムをシステムの残りの部分から分離し、キャッシュ効率を向上させます。 オプションとして、通常の GNU Make を使用してビルドする機能も保持されます。
  • マルチスレッド用の関数、_spawn() および _join() が実装されました。これらは、さまざまなオペレーティング システムに固有の API に対するユニバーサル バインディングです。 POSIX スレッドのサポートを実装する作業も進行中です。
  • _Thread_local キーワードを使用すると、スレッドごとに個別のストレージ (TLS、スレッドローカル ストレージ) を使用できます。 デフォルトでは、C ランタイムはメインスレッドの TLS を初期化するため、実行可能ファイルの最小サイズが 12 KB から 16 KB に増加しました。
  • すべての関数呼び出しとシステム コールに関する情報を stderr に出力するために、「--ftrace」および「--strace」パラメーターのサポートが実行可能ファイルに追加されました。
  • Linux 5.9 以降、FreeBSD 8 以降、および OpenBSD でサポートされる closefrom() システム コールのサポートが追加されました。
  • Linux プラットフォームでは、vDSO (仮想動的共有オブジェクト) メカニズムを使用することにより、 Clock_gettime および gettimeofday 呼び出しのパフォーマンスが最大 10 倍向上しました。これにより、システム コール ハンドラーをユーザー空間に移動し、コンテキストの切り替えを回避することが可能になります。
  • 複素数を扱うための数学関数は Musl ライブラリから移動されました。 多くの数学関数の動作が高速化されました。
  • nointernet() 関数は、ネットワーク機能を無効にするために提案されています。
  • 文字列を効率的に追加するための新しい関数、appendd、appendf、appendr、appends、appendw、appendz、kappendf、kvappendf、vappendf を追加しました。
  • 昇格された特権で動作するように設計された、関数の kprintf() ファミリの保護されたバージョンが追加されました。
  • SSL、SHA、curve25519、および RSA 実装のパフォーマンスが大幅に向上しました。

出所: オープンネット.ru

コメントを追加します