Vydanie štandardnej knižnice C Cosmopolitan 2.0 vyvinutej pre prenosné spustiteľné súbory

Bolo zverejnené vydanie projektu Cosmopolitan 2.0, ktorý vyvíja štandardnú knižnicu C a univerzálny formát spustiteľných súborov, ktorý možno použiť na distribúciu programov pre rôzne operačné systémy bez použitia tlmočníkov a virtuálnych strojov. Výsledok získaný kompiláciou v GCC a Clang je skompilovaný do staticky prepojeného univerzálneho spustiteľného súboru, ktorý je možné spustiť na akejkoľvek distribúcii Linuxu, macOS, Windows, FreeBSD, OpenBSD, NetBSD a dokonca aj volať z BIOSu. Kód projektu je distribuovaný pod licenciou ISC (zjednodušená verzia MIT/BSD).

Kontajner na generovanie univerzálnych spustiteľných súborov je založený na kombinovaní segmentov a hlavičiek špecifických pre rôzne operačné systémy (PE, ELF, MACHO, OPENBSD) v jednom súbore, pričom kombinuje niekoľko rôznych formátov používaných v Unixe, Windows a macOS. Aby sa zabezpečilo, že jeden spustiteľný súbor beží na systémoch Windows a Unix, trikom je zakódovať súbory Windows PE ako skripty shellu, pričom sa využije skutočnosť, že Thompson Shell nepoužíva značku skriptu „#!“. Na vytváranie programov, ktoré obsahujú niekoľko súborov (prepojenie všetkých zdrojov do jedného súboru), podporuje vytvorenie spustiteľného súboru vo forme špeciálne navrhnutého archívu ZIP. Schéma navrhovaného formátu (príklad aplikácie hello.com):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(príkaz -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… KÓD A ÚDAJE… ZIP DIRECTORY…

Na začiatku súboru je uvedený štítok „MZqFpD“, ktorý je vnímaný ako hlavička formátu Windows PE. Táto sekvencia je tiež dekódovaná v inštrukcii „pop %r10; jno 0x4a ; jo 0x4a" a riadok "\177ELF" na inštrukciu "jg 0x47", ktoré sa používajú na presmerovanie do vstupného bodu. Unixové systémy spúšťajú kód shellu, ktorý používa príkaz exec, pričom spustiteľný kód prechádza cez nepomenovaný kanál. Obmedzením navrhovanej metódy je schopnosť bežať na operačných systémoch podobných Unixu iba pomocou shellov, ktoré podporujú režim kompatibility Thompson Shell.

Volanie qemu-x86_64 poskytuje dodatočnú prenosnosť a umožňuje, aby kód zostavený pre architektúru x86_64 bežal na platformách iných ako x86, ako sú dosky Raspberry Pi a zariadenia Apple vybavené procesormi ARM. Projekt možno použiť aj na vytváranie samostatných aplikácií, ktoré bežia bez operačného systému (holý kov). V takýchto aplikáciách je bootloader pripojený k spustiteľnému súboru a program funguje ako zavádzací operačný systém.

Štandardná knižnica C libc vyvinutá projektom ponúka 2024 funkcií (v prvom vydaní to bolo asi 1400 funkcií). Čo sa týka výkonu, Cosmopolitan funguje rovnako rýchlo ako glibc a výrazne predbieha Musl a Newlib, napriek tomu, že Cosmopolitan je rádovo menší veľkosťou kódu ako glibc a približne zodpovedá Musl a Newlib. Na optimalizáciu často volaných funkcií, ako sú memcpy a strlen, sa dodatočne používa technika „trickle-down performance“, v ktorej sa na volanie funkcie používa makro väzba, v ktorej je kompilátor informovaný o registroch CPU zapojených do vykonávania kódu. proces, ktorý umožňuje šetrenie zdrojov pri ukladaní stavu CPU uložením iba meniteľných registrov.

Medzi zmeny v novom vydaní:

  • Schéma prístupu k interným zdrojom v súbore zip bola zmenená (pri otváraní súborov sa teraz namiesto použitia predpony zip:.. používajú obvyklé cesty /zip/...). Podobne na prístup k diskom v systéme Windows je možné použiť cesty ako „/c/...“ namiesto „C:/...“.
  • Bol navrhnutý nový zavádzač APE (Actually Portable Executable), ktorý definuje formát univerzálnych spustiteľných súborov. Nový zavádzač používa mmap na umiestnenie programu do pamäte a už nemení obsah za behu. V prípade potreby je možné univerzálny spustiteľný súbor previesť na bežné spustiteľné súbory viazané na jednotlivé platformy.
  • Na platforme Linux je možné použiť modul jadra binfmt_misc na spustenie programov APE. Je potrebné poznamenať, že použitie binfmt_misc je najrýchlejšia metóda spustenia.
  • Pre Linux bola navrhnutá implementácia funkcionality systémových volaní pledge() a unveil() vyvinutých projektom OpenBSD. K dispozícii je rozhranie API na používanie týchto volaní v programoch v jazykoch C, C++, Python a Redbean, ako aj nástroj pledge.com na izoláciu ľubovoľných procesov.
  • Zostavenie používa nástroj Landlock Make - vydanie GNU Make s prísnejšou kontrolou závislostí a použitím systémového volania Landlock na izoláciu programu od zvyšku systému a zlepšenie efektivity ukladania do vyrovnávacej pamäte. Možnosť stavať s bežným GNU Make je zachovaná.
  • Boli implementované funkcie pre multithreading – _spawn() a _join(), čo sú univerzálne väzby cez API špecifické pre rôzne operačné systémy. Pracuje sa aj na implementácii podpory POSIX Threads.
  • Je možné použiť kľúčové slovo _Thread_local na použitie samostatného úložiska pre každé vlákno (TLS, Thread-Local Storage). V predvolenom nastavení modul runtime C inicializuje TLS pre hlavné vlákno, čo spôsobilo zvýšenie minimálnej veľkosti spustiteľného súboru z 12 na 16 KB.
  • Do spustiteľných súborov bola pridaná podpora pre parametre „--ftrace“ a „--strace“ na výstup informácií o všetkých volaniach funkcií a systémových volaniach do stderr.
  • Pridaná podpora pre systémové volanie closefrom(), podporované na Linuxe 5.9+, FreeBSD 8+ a OpenBSD.
  • Na platforme Linux sa výkon volaní clock_gettime a gettimeofday zvýšil až 10-krát pomocou mechanizmu vDSO (virtual dynamic shared object), ktorý umožňuje presunúť obsluhu systémových volaní do užívateľského priestoru a vyhnúť sa prepínaniu kontextu.
  • Z knižnice Musl boli presunuté matematické funkcie pre prácu s komplexnými číslami. Zrýchlila sa práca mnohých matematických funkcií.
  • Funkcia nointernet() bola navrhnutá na deaktiváciu sieťových funkcií.
  • Pridané nové funkcie pre efektívne pridávanie reťazcov: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf a vappendf.
  • Pridaná chránená verzia rodiny funkcií kprintf() navrhnutá na prácu so zvýšenými privilégiami.
  • Výrazne zlepšený výkon implementácií SSL, SHA, curve25519 a RSA.

Zdroj: opennet.ru

Pridať komentár