Vydání standardní knihovny C Cosmopolitan 2.0, vyvinuté pro přenosné spustitelné soubory

Bylo zveřejněno vydání projektu Cosmopolitan 2.0, který vyvíjí standardní knihovnu C a univerzální formát spustitelných souborů, který lze použít k distribuci programů pro různé operační systémy bez použití interpretů a virtuálních strojů. Výsledek získaný kompilací v GCC a Clang je zkompilován do staticky propojeného univerzálního spustitelného souboru, který lze spustit na libovolné distribuci Linuxu, macOS, Windows, FreeBSD, OpenBSD, NetBSD a dokonce jej volat z BIOSu. Kód projektu je distribuován pod licencí ISC (zjednodušená verze MIT/BSD).

Kontejner pro generování univerzálních spustitelných souborů je založen na kombinaci segmentů a hlaviček specifických pro různé operační systémy (PE, ELF, MACHO, OPENBSD) v jednom souboru, který kombinuje několik různých formátů používaných v Unixu, Windows a macOS. Aby bylo zajištěno, že jeden spustitelný soubor běží na systémech Windows a Unix, trikem je zakódovat soubory Windows PE jako skripty prostředí s využitím skutečnosti, že Thompson Shell nepoužívá značku skriptu „#!“. Pro vytváření programů, které obsahují několik souborů (spojující všechny zdroje do jednoho souboru), podporuje vytvoření spustitelného souboru ve formě speciálně navrženého ZIP archivu. Schéma navrhovaného formátu (příklad aplikace hello.com):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(pří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... CODE AND DATA... ZIP DIRECTORY...

Na začátku souboru je uveden štítek „MZqFpD“, který je vnímán jako záhlaví formátu Windows PE. Tato sekvence je také dekódována v instrukci „pop %r10; jno 0x4a ; jo 0x4a" a řádek "\177ELF" k instrukci "jg 0x47", které se používají k předání do vstupního bodu. Unixové systémy spouštějí kód shellu, který používá příkaz exec a předává spustitelný kód přes nepojmenovanou rouru. Omezením navrhované metody je možnost spouštět na operačních systémech podobných Unixu pouze pomocí shellů, které podporují režim kompatibility Thompson Shell.

Volání qemu-x86_64 poskytuje další přenositelnost a umožňuje, aby kód zkompilovaný pro architekturu x86_64 běžel na platformách jiných než x86, jako jsou desky Raspberry Pi a zařízení Apple vybavená procesory ARM. Projekt lze také použít k vytvoření samostatných aplikací, které běží bez operačního systému (holý kov). V takových aplikacích je ke spustitelnému souboru připojen bootloader a program funguje jako zaváděcí operační systém.

Standardní knihovna C libc vyvinutá projektem nabízí 2024 funkcí (v prvním vydání to bylo asi 1400 funkcí). Co se týče výkonu, Cosmopolitan funguje stejně rychle jako glibc a je znatelně před Muslem a Newlibem, a to i přesto, že Cosmopolitan je velikostí kódu řádově menší než glibc a přibližně odpovídá Muslovi a Newlibu. Pro optimalizaci často volaných funkcí, jako je memcpy a strlen, se navíc používá technika „trickle-down performance“, ve které se k volání funkce používá makro vazba, ve které je kompilátor informován o registrech CPU zapojených do provádění kódu. proces, který umožňuje šetřit prostředky při ukládání stavu CPU uložením pouze měnitelných registrů.

Mezi změny v nové verzi:

  • Schéma přístupu k interním zdrojům uvnitř souboru zip bylo změněno (při otevírání souborů se nyní místo použití předpony zip:.. používají obvyklé cesty /zip/...). Podobně pro přístup k diskům ve Windows je možné použít cesty jako „/c/...“ místo „C:/...“.
  • Byl navržen nový zavaděč APE (Actually Portable Executable), který definuje formát univerzálních spustitelných souborů. Nový zavaděč používá mmap k umístění programu do paměti a již nemění obsah za chodu. V případě potřeby lze univerzální spustitelný soubor převést na běžné spustitelné soubory vázané na jednotlivé platformy.
  • Na platformě Linux je možné ke spouštění programů APE použít modul jádra binfmt_misc. Je třeba poznamenat, že použití binfmt_misc je nejrychlejší způsob spouštění.
  • Pro Linux byla navržena implementace funkcionality systémových volání pledge() a unveil() vyvinutých projektem OpenBSD. Pro použití těchto volání v programech v C, C++, Pythonu a Redbean je k dispozici API, stejně jako nástroj pledge.com pro izolaci libovolných procesů.
  • Sestavení používá utilitu Landlock Make - edici GNU Make s přísnější kontrolou závislostí a použitím systémového volání Landlock k izolaci programu od zbytku systému a zlepšení efektivity ukládání do mezipaměti. Možnost sestavit pomocí běžného GNU Make je zachována.
  • Byly implementovány funkce pro multithreading – _spawn() a _join(), což jsou univerzální vazby přes API specifické pro různé operační systémy. Pracuje se také na implementaci podpory POSIX Threads.
  • Je možné použít klíčové slovo _Thread_local pro použití samostatného úložiště pro každé vlákno (TLS, Thread-Local Storage). Ve výchozím nastavení běhové prostředí C inicializuje TLS pro hlavní vlákno, což způsobilo zvýšení minimální velikosti spustitelného souboru z 12 na 16 KB.
  • Do spustitelných souborů byla přidána podpora pro parametry „--ftrace“ a „--strace“ pro výstup informací o všech voláních funkcí a systémových voláních do stderr.
  • Přidána podpora pro systémové volání closefrom(), podporované na Linuxu 5.9+, FreeBSD 8+ a OpenBSD.
  • Na platformě Linux byl výkon volání clock_gettime a gettimeofday zvýšen až 10krát pomocí mechanismu vDSO (virtual dynamic shared object), který umožňuje přesunout obsluhu systémových volání do uživatelského prostoru a vyhnout se přepínání kontextu.
  • Z knihovny Musl byly přesunuty matematické funkce pro práci s komplexními čísly. Zrychlila se práce mnoha matematických funkcí.
  • Funkce nointernet() byla navržena pro deaktivaci síťových funkcí.
  • Přidány nové funkce pro efektivní připojování řetězců: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf a vappendf.
  • Přidána chráněná verze rodiny funkcí kprintf() navržená pro práci se zvýšenými oprávněními.
  • Výrazně zlepšený výkon implementací SSL, SHA, curve25519 a RSA.

Zdroj: opennet.ru

Přidat komentář