Vydání standardní C knihovny Cosmopolitan 2.0, vyvíjené pro přenositelné spustitelné soubory

Byla vydána verze projektu Cosmopolitan 2.0, která rozvíjí standardní C knihovnu a univerzální formát spustitelných souborů, který lze využít pro distribuci programů na různých operačních systémech bez použití interpretrů a virtuálních strojů. Výsledek získaný pomocí kompilace v GCC a Clang se spojí do staticky linkovaného univerzálního spustitelného souboru, který je vhodný pro spuštění na jakémkoli distribuci Linuxu, macOS, Windows, FreeBSD, OpenBSD, NetBSD a dokonce i pro spuštění z BIOSu. Kód projektu je šířen pod licencí ISC (zjednodušená varianta MIT/BSD).

Kontejner pro vytváření univerzálních spustitelných souborů je založen na kombinaci specifických segmentů a hlaviček pro různé operační systémy (PE, ELF, MACHO, OPENBSD) v jednom souboru a kombinuje několik různých formátů používaných v Unixu, Windows a macOS. Pro zajištění spuštění jednoho spustitelného souboru ve Windows a Unixových systémech se používá trik, který spočívá v kódování souborů Windows PE ve formě shell skriptu, přičemž Thompson Shell nepoužívá marker skriptu „#!“. Pro tvorbu programů zahrnujících několik souborů (kombinace všech zdrojů do jednoho souboru) je podporována tvorba spustitelného souboru ve formě speciálně upraveného ZIP archivu. Schéma navrhovaného formátu (příklad aplikace 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čátku souboru je uvedena značka „MZqFpD“, která je vnímána jako hlavička formátu Windows PE. Tato posloupnost je také dekódována do instrukce „pop %r10 ; jno 0x4a ; jo 0x4a“, a řetězec „\177ELF“ do instrukce „jg 0x47“, které se používají pro přesměrování na vstupní bod. V Unixových systémech se vykonává shell kód, v němž se používá příkaz exec s předáním spustitelného kódu přes anonymní kanál. Omezením navrhované metody je možnost spuštění v Unixových operačních systémech pouze pomocí shellů, které podporují režim kompatibility s Thompson Shell.

Volání qemu-x86_64 je určeno k zajištění další přenositelnosti a umožňuje provádět kód zkompilovaný pro architekturu x86_64 na platformách odlišných od x86, například na deskách Raspberry Pi a zařízeních Apple vybavených procesory ARM. Projekt může být také použit k vytváření samostatných aplikací, které fungují bez operačního systému (bare metal). V takových aplikacích je k spustitelnému souboru připojen zaváděcí program a program funguje jako zaváděcí operační systém.

Ve standardní C knihovně libc, vyvíjené projektem, je navrženo 2024 funkcí (v první verzi bylo kolem 1400 funkcí). Z hlediska výkonu Cosmopolitan funguje stejně rychle jako glibc a významně předehnal Musl a Newlib, přičemž Cosmopolitan je velikostně o pořádek menší než glibc a přibližně odpovídá Musl a Newlib. Pro optimalizaci často volaných funkcí, jako jsou memcpy a strlen, se navíc používá technika "trickle-down performance", kdy se pro volání funkce použije makro-obálka, ve které je kompilátor informován o registrech CPU zapojených do provádění kódu, což šetří prostředky při zachování stavu CPU uložením pouze měněných registrů.

Mezi změnami v novém vydání:

  • Byla změněna schéma přístupu k interním zdrojům uvnitř zip souboru (při otevírání souborů se nyní používají běžné cesty /zip/... místo přístupu pomocí prefixu zip:..). Podobně pro přístup na disky ve Windows byla poskytnuta možnost používat cesty ve formátu "/c/..." místo "C:/...".
  • Byl navržen nový zaváděcí program APE (Actually Portable Executable), který určuje formát univerzálních spustitelných souborů. Nový zaváděcí program používá mmap k umístění programu v paměti a již nezměňuje obsah za běhu. V případě potřeby může být univerzální spustitelný soubor převeden na běžné spustitelné soubory vázané na jednotlivé platformy.
  • Na platformě Linux byla implementována možnost použití jádrového modulu binfmt_misc pro spouštění APE programů. Použití binfmt_misc se považuje za nejrychlejší metodu spuštění.
  • Pro Linux byla navržena implementace systémových volání pledge() a unveil(), které vyvíjí projekt OpenBSD. Bylo poskytnuto API pro použití těchto volání v programech v jazycích C, C++, Python a Redbean, stejně jako nástroj pledge.com pro izolaci libovolných procesů.
  • Pro sestavení se využívá nástroj Landlock Make — edice GNU Make s přísnějším ověřováním závislostí a použitím systémového volání Landlock pro izolaci programu od zbylé části systému a zvýšení efektivity ukládání do mezipaměti. Jako možnost zůstává zachována funkcionalita pro běžné GNU Make.
  • Byly implementovány funkce pro vícevláknové programování — _spawn() a _join(), které představují univerzální obálky nad specifickými API pro různé operační systémy. Pracuje se také na implementaci podpory POSIX Threads.
  • Byla poskytnuta možnost použití klíčového slova _Thread_local pro využití jednotlivých úložišť pro každý vlákno (TLS, Thread-Local Storage). Ve výchozím nastavení C runtime inicializuje TLS pro hlavní vlákno, což vedlo ke zvýšení minimální velikosti spustitelného souboru z 12 na 16 kB.
  • Do spustitelných souborů byla přidána podpora parametrů "—ftrace" a "—strace" pro výstup do stderr informací o všech voláních funkcí a systémových voláních.
  • Byla přidána podpora systémového volání closefrom(), které je podporováno v Linuxu 5.9+, FreeBSD 8+ a OpenBSD.
  • Na platformě Linux byla až 10krát zvýšena výkonnost volání clock_gettime a gettimeofday díky použití mechanismu vDSO (virtual dynamic shared object), který umožňuje přesunout zpracovatele systémového volání do uživatelského prostoru a vyhnout se přepínání kontextu.
  • Z knihovny Musl byly přeneseny matematické funkce pro práci se složenými čísly. Byla zrychlena práce mnoha matematických funkcí.
  • Byla navržena funkce nointernet(), která deaktivuje síťové možnosti.
  • Byly přidány nové funkce pro efektivní připojení řetězců: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf a vappendf.
  • Byla přidána chráněná varianta rodiny funkcí kprintf(), určená pro práci při zvýšených oprávněních.
  • Významně byla zvýšena výkonnost implementací SSL, SHA, curve25519 a RSA.

Zdroj: opennet.ru

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster