發布標準 C 庫 Cosmopolitan 2.0,專為可移植可執行檔而開發

Cosmopolitan 2.0專案的版本已經發布,開發了標準C庫和通用可執行檔格式,可用於為不同作業系統分發程序,而無需使用解釋器和虛擬機器。在GCC和Clang中編譯得到的結果被編譯成靜態連結的通用可執行文件,可以在任何Linux發行版、macOS、Windows、FreeBSD、OpenBSD、NetBSD上運行,甚至可以從BIOS呼叫。專案代碼在 ISC 許可證(MIT/BSD 的簡化版本)下分發。

用於產生通用執行檔的容器是基於將特定於不同作業系統(PE、ELF、MACHO、OPENBSD)的段和標頭組合到一個檔案中,組合了Unix、Windows 和macOS 中使用的幾種不同格式。為了確保單一可執行檔在 Windows 和 Unix 系統上運行,一個技巧是將 Windows PE 檔案編碼為 shell 腳本,利用 Thompson Shell 不使用「#!」腳本標記的事實。為了創建包含多個檔案的程式(將所有資源連結到一個檔案中),它支援以專門設計的 ZIP 檔案的形式形成可執行檔。建議的格式方案(例如 hello.com 應用程式):

MZqFpD='BIOS 開機磁區' exec 7 $(指令-v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" " $ @" 退出 1 實模式... ELF 段... OpenBSD 注意... MACHO 標頭... 程式碼與資料... ZIP 目錄...

在文件的開頭,標有“MZqFpD”標籤,該標籤被視為 Windows PE 格式標頭。這個序列也在指令「pop %r10;」中解碼。 jno 0x4a; jo 0x4a”,以及指令“jg 177x0”的“\47ELF”行,用於轉送到入口點。 Unix 系統運行使用 exec 指令的 shell 程式碼,透過無名管道傳遞可執行程式碼。所提出方法的限制是只能使用支援 Thompson Shell 相容模式的 shell 在類別 Unix 作業系統上運行。

qemu-x86_64 呼叫提供了額外的可移植性,並允許為 x86_64 架構編譯的程式碼在非 x86 平台上運行,例如 Raspberry Pi 板和配備 ARM 處理器的 Apple 裝置。該專案還可用於建立無需作業系統(裸機)即可運行的獨立應用程式。在此類應用程式中,引導程式附加到可執行文件,並且該程式充當可引導作業系統。

本專案開發的標準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() 和unvell() 系統呼叫功能的實作。提供了一個API,用於在C、C++、Python 和Redbean 程式中使用這些調用,以及用於隔離任意進程的pledge.com 實用程式。
  • 該建置使用 Landlock Make 實用程式 - GNU Make 的一個版本,具有更嚴格的依賴性檢查,並使用 Landlock 系統呼叫將程式與系統的其餘部分隔離並提高快取效率。作為一個選項,保留了使用常規 GNU Make 進行建置的能力。
  • 多執行緒函數已實作 - _spawn() 和 _join(),它們是特定於不同作業系統的 API 的通用綁定。實作 POSIX 執行緒支援的工作也在進行中。
  • 可以使用 _Thread_local 關鍵字為每個執行緒使用單獨的儲存(TLS,執行緒本地儲存)。預設情況下,C 運行時為主執行緒初始化 TLS,這導致最小可執行檔大小從 12 KB 增加到 16 KB。
  • 可執行檔中新增了對「--ftrace」和「--strace」參數的支持,以將有關所有函數呼叫和系統呼叫的資訊輸出到 stderr。
  • 新增了對 closefrom() 系統呼叫的支持,在 Linux 5.9+、FreeBSD 8+ 和 OpenBSD 上受支援。
  • 在Linux平台上,透過使用vDSO(虛擬動態共享物件)機制,clock_gettime和gettimeofday呼叫的效能最高提高了10倍,這使得將系統呼叫處理程序移至用戶空間並避免上下文切換成為可能。
  • 用於處理複數的數學函數已從 Musl 庫中移出。許多數學函數的工作都得到了加速。
  • nointernet() 函數已被提議用於停用網路功能。
  • 新增了用於高效附加字串的新函數:append、appendf、appendr、appends、appendw、appendz、kappendf、kvappendf 和 vappendf。
  • 新增了 kprintf() 系列函數的受保護版本,旨在使用提升的權限。
  • 顯著提高了 SSL、SHA、curve25519 和 RSA 實施的效能。

來源: opennet.ru

添加評論