Bol sa zverejnený vydanie projektu Cosmopolitan 2.0, ktorý rozvíja štandardnú C knižnicu a univerzálny formát spustiteľných súborov, ktorý sa môže použiť na distribúciu programov pre rôzne operačné systémy bez použitia interpreterov a virtuálnych strojov. Výstup vytvorený pomocou GCC a Clang je skompilovaný do staticky viazaného univerzálneho spustiteľného súboru, ktorý je vhodný na spustenie v akýchkoľvek distribúciách Linuxu, macOS, Windows, FreeBSD, OpenBSD, NetBSD a dokonca aj na vyvolanie z BIOSu. Kód projektu je distribuovaný pod licenciou ISC (zjednodušená verzia MIT/BSD).
Kontajner pre tvorbu univerálnych spustiteľných súborov je založený na kombinácii segmentov a hlavičiek špecifických pre rôzne operačné systémy (PE, ELF, MACHO, OPENBSD) v jednom súbore, kombinujúc v ňom niekoľko rôznych formátov používaných v Unix, Windows a macOS. Na zabezpečenie spustenia jedného spustiteľného súboru vo Windows a Unixových systémoch sa používa trik súvisiaci s kódovaním Windows PE súborov ako shell skriptu, pričom sa využíva fakt, že Thompson Shell nepoužíva marker skriptu „#!“. Na vytváranie programov zahŕňajúcich niekoľko súborov (kompozícia všetkých zdrojov do jedného súboru) sa podporuje vytvorenie spustiteľného súboru ako špeciálne formátovaného ZIP archívu. Schéma navrhovaného formátu (príklad aplikácie hello.com):
MZqFpD=’ BIOS BOOT SECTOR’ 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…
Na začiatku súboru je uvedená značka „MZqFpD“, ktorá je vnímaná ako hlavička formátu Windows PE. Táto sekvencia je tiež dekódovaná v inštrukciách „pop %r10 ; jno 0x4a ; jo 0x4a“, a reťazec „\177ELF“ v inštrukciu „jg 0x47“, ktoré sú použité na presmerovanie na vstupný bod. V Unixových systémoch sa vykonáva shell kód, v ktorom sa používa príkaz exec na predanie spustiteľného kódu cez anonymný kanál. Obmedzením navrhnutého metódy je možnosť spustenia v Unix-podobných OS iba s použitím shellov, ktoré podporujú režim kompatibility s Thompson Shell.
Volanie qemu-x86_64 je navrhnuté na implementáciu dodatočnej prenosnosti a umožňuje spustiť skompilovaný kód pre architektúru x86_64 na platformách odlišných od x86, napríklad na doskách Raspberry Pi a zariadeniach Apple vybavených procesormi ARM. Projekt môže byť tiež použitý na vytváranie samostatných aplikácií, ktoré fungujú bez operačného systému (bare metal). V takých aplikáciách je k spustiteľnému súboru pripevnený bootloader a program funguje ako načítateľný operačný systém.
V štandardnej knižnici C libc, ktorá je vyvíjaná projektom, je navrhnutých 2024 funkcií (v prvom vydaní bolo približne 1400 funkcií). Z hľadiska výkonu Cosmopolitan pracuje rovnako rýchlo ako glibc a výrazne predbehne Musl a Newlib, pričom Cosmopolitan má veľkosť kódu porovnateľnú s Musl a Newlib, ale je o poriadok menší ako glibc. Pre optimalizáciu často volaných funkcií, ako sú memcpy a strlen, sa dodatočne využíva technika "trickle-down performance", pri ktorej sa na volanie funkcie aplikuje makro-vrstvenie, v ktorom je kompilátor informovaný o registroch CPU zapojených do vykonávania kódu, čo umožňuje šetriť zdroje pri zachovávaní stavu CPU uložením iba meniacej sa registratúry.
Medzi zmenami v novom vydaní:
- Zmenená schéma prístupu k interným zdrojom v rámci zip súboru (pri otváraní súborov sú teraz použité bežné cesty /zip/... namiesto prístupu pomocou prefixu zip:..). Podobne pre prístup k diskom vo Windows bola poskytnutá možnosť používať cesty ako " /c/..." namiesto "C:/...".
- Navrhnutý nový bootloader APE (Actually Portable Executable), ktorý definuje formát univerzálnych spustiteľných súborov. Nový bootloader používa mmap na umiestnenie programu do pamäte a viacej nemodifikuje obsah za behu. Ak je to potrebné, univerzálny spustiteľný súbor môže byť konvertovaný na bežné spustiteľné súbory viazané na jednotlivé platformy.
- Na platforme Linux bola implementovaná možnosť využitia modulu jadra binfmt_misc na spúšťanie APE-programov. Uvádza sa, že využitie binfmt_misc je najrýchlejšou metódou spúšťania.
- Pre Linux je navrhnutá implementácia funkčnosti systémových volaní pledge() a unveil(), vyvíjaných projektom OpenBSD. Poskytuje sa API na použitie 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.
- Na zostavenie sa používa nástroj Landlock Make – verzia GNU Make s prísnejšou kontrolou závislostí a využitím systémového volania Landlock na izoláciu programu od zvyšku systému a zvýšenie efektivity cache. Možnosť zostavenia pomocou bežného GNU Make zostáva ako opcia.
- Implementované sú funkcie pre viacvláknovosť – _spawn() a _join(), ktoré predstavujú univerzálne obálky nad špecifickými pre rôzne operačné systémy API. Pracuje sa aj na podpore POSIX Threads.
- Poskytla sa možnosť použitia kľúčového slova _Thread_local na používanie samostatných úložísk pre každý vlákno (TLS, Thread-Local Storage). Predvolene C runtime 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 parametrov „—ftrace“ a „—strace“ pre výstup do stderr informácií o všetkých volaniach funkcií a systémových volaniach.
- Pridaná podpora systémového volania closefrom(), podporovaného v Linuxe 5.9+, FreeBSD 8+ a OpenBSD.
- Na platforme Linux bola zvýšená výkonnosť volaní clock_gettime a gettimeofday až 10-krát vďaka využitiu mechanizmu vDSO (virtual dynamic shared object), ktorý umožňuje preniesť obsluhu systémového volania do priestoru užívateľa a vyhnúť sa prepinaniam kontextu.
- Z knižnice Musl boli prenesené matematické funkcie na prácu s komplexnými číslami. Zrýchlená práca mnohých matematických funkcií.
- Navrhnutá funkcia nointernet(), ktorá vypína sieťové možnosti.
- Pridané nové funkcie na efektívne pripojenie reťazcov: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf a vappendf.
- Pridaná chránená verzia rodiny funkcií kprintf(), určená na prácu pri zvýšených privilégiách.
- Významne zvýšený výkon realizácií SSL, SHA, curve25519 a RSA.
Zdroj: opennet.ru
