Projektet Cosmopolitan 2.0, som utvecklar ett standardbibliotek i C och ett universellt körbart format som kan anvÀndas för att distribuera program över olika operativsystem utan behov av tolkar eller virtuella maskiner, har slÀppts. Kompilering med GCC och Clang resulterar i en statiskt lÀnkad universell körbar fil som kan köras pÄ vilken distribution som helst. Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD och till och med BIOS-Ätkomst. Projektets kod distribueras under ISC-licensen (en förenklad version av MIT/BSD-licensen).
BehÄllaren för att skapa universella körbara filer Àr baserad pÄ att kombinera segment och rubriker (PE, ELF, MACHO, OPENBSD) specifika för olika operativsystem i en fil, och kombinera flera olika format som anvÀnds i Unix, Windows О macOSFör att sÀkerstÀlla att en körbar fil kan startas i Windows och Unix-system anvÀnder ett trick relaterat till filkodning Windows PE som ett shellskript, vilket utnyttjar Thompson Shells avsaknad av skriptmarkören "#!". För att skapa program som innehÄller flera filer (kombinera alla resurser till en enda fil) kan den körbara filen skapas som ett specialformaterat ZIP-arkiv. Det föreslagna formatet (exempel: hello.com-applikation):
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 SEGMENT... OPENBSD OBS... MACHO HEADERS...KOD OCH DATA...ZIP-KATALOG...
I början av filen anges etiketten "MZqFpD", vilket uppfattas som formathuvudet Windows PE. Denna sekvens avkodas ocksÄ till instruktionen "pop %r10; jno 0x4a; jo 0x4a" och strÀngen "\177ELF" till instruktionen "jg 0x47", vilka anvÀnds för omdirigering till startpunkten. PÄ Unix-system exekveras skalkod med hjÀlp av exec-kommandot, varvid den exekverbara koden skickas genom en namnlös pipe. En begrÀnsning med den föreslagna metoden Àr att den bara kan köras pÄ Unix-liknande operativsystem som anvÀnder skal som stöder Thompson Shell-kompatibilitetslÀge.
Anropet qemu-x86_64 tillhandahÄlls för ytterligare portabilitet, vilket gör att kod som kompilerats för x86_64-arkitekturen kan köras pÄ icke-x86-plattformar, sÄsom Raspberry Pi-kort och Apple-enheter utrustade med ARM-processorer. Projektet kan ocksÄ anvÀndas för att skapa fristÄende applikationer som körs utan operativsystem (bare metal). I sÄdana applikationer Àr en bootloader kopplad till den körbara filen, och programmet fungerar som ett startbart operativsystem.
Standardbiblioteket libc, som utvecklats av projektet, erbjuder 2024 funktioner (den första utgÄvan hade cirka 1400 funktioner). PrestandamÀssigt fungerar Cosmopolitan lika snabbt som glibc och ligger mÀrkbart före Musl och Newlib, trots att Cosmopolitan Àr en storleksordning mindre Àn glibc i kodstorlek och Àr ungefÀr lika med Musl och Newlib. För att optimera ofta anropade funktioner som memcpy och strlen anvÀnds dessutom "trickle-down performance"-tekniken, dÀr en makrobindning anvÀnds för att anropa en funktion, dÀr kompilatorn informeras om de CPU-register som Àr involverade i kodkörningen, vilket gör det möjligt att spara resurser samtidigt som CPU-tillstÄndet bibehÄlls genom att endast de Àndringsbara registren sparas.
Bland Àndringarna i den nya utgÄvan:
- Hur interna resurser nÄs i en zip-fil har Àndrats (nÀr filer öppnas anvÀnds nu de vanliga sökvÀgarna /zip/⊠istÀllet för att nÄ dem med prefixet zip:..). PÄ liknande sÀtt Àr Ätkomst till diskar i Windows Möjligheten att anvÀnda sökvÀgar som "/c/..." istÀllet för "C:/..." har introducerats.
- En ny APE-laddare (Actually Portable Executable) har föreslagits, som definierar formatet för universella körbara filer. Den nya laddaren anvÀnder mmap för att placera programmet i minnet och Àndrar inte lÀngre innehÄllet i farten. Vid behov kan den universella körbara filen konverteras till vanliga körbara filer kopplade till enskilda plattformar.
- PÄ plattformen Linux Möjligheten att anvÀnda kÀrnmodulen binfmt_misc för att starta APE-program har implementerats. Det bör noteras att binfmt_misc Àr den snabbaste startmetoden.
- för Linux En implementering av systemanropen pledge() och unveil() som utvecklats av OpenBSD-projektet föreslÄs. Ett API tillhandahÄlls för att anvÀnda dessa anrop i C-, C++-, Python- och Redbean-program, samt verktyget pledge.com för att isolera godtyckliga processer.
- Verktyget Landlock Make anvĂ€nds för assembler â en version av GNU Make med en strĂ€ngare beroendekontroll och anvĂ€ndningen av Landlock-systemanropet för att isolera programmet frĂ„n resten av systemet och förbĂ€ttra cachningseffektiviteten. Möjligheten att bygga med vanlig GNU Make behĂ„lls som ett alternativ.
- Funktioner för multitrĂ„dning har implementerats â _spawn() och _join(), vilka Ă€r universella bindningar över API:er specifika för olika operativsystem. Arbete pĂ„gĂ„r ocksĂ„ för att implementera stöd för POSIX-trĂ„dar.
- Möjligheten att anvÀnda nyckelordet _Thread_local för att anvÀnda TLS (Thread-Local Storage) per trÄd har introducerats. Som standard initierar C-körningen TLS för huvudtrÄden, vilket har ökat den minsta storleken pÄ körbara filer frÄn 12 till 16 KB.
- Lade till stöd för parametrarna "--ftrace" och "--strace" till körbara filer för att skriva ut information om alla funktionsanrop och systemanrop till stderr.
- Lade till stöd för systemanropet closefrom(), stöds i Linux 5.9+, FreeBSD 8+ och OpenBSD.
- PÄ plattformen Linux Prestandan för clock_gettime- och gettimeofday-anrop har ökats upp till 10 gÄnger genom att anvÀnda vDSO-mekanismen (virtuellt dynamiskt delat objekt), vilket gör det möjligt att flytta systemanropshanteraren till anvÀndarutrymmet och undvika kontextvÀxlar.
- Matematiska funktioner för att arbeta med komplexa tal har överförts frÄn Musl-biblioteket. Arbetet med mÄnga matematiska funktioner har accelererats.
- En nointernet()-funktion har föreslagits för att inaktivera nÀtverksfunktioner.
- Nya funktioner har lagts till för effektiv strÀngtillÀgg: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf och vappendf.
- Lade till en skyddad version av kprintf()-funktionsfamiljen, utformad för att fungera med förhöjda privilegier.
- AvsevÀrt förbÀttrad prestanda för implementeringar SSL, SHA, kurva25519 och RSA.
KĂ€lla: opennet.ru
