UtgÄvan av projektet Cosmopolitan 2.0 har publicerats, som utvecklar ett standard C-bibliotek och ett universellt format för körbara filer som kan anvÀndas för att distribuera program för olika operativsystem utan att anvÀnda tolkar och virtuella maskiner. Resultatet som erhÄlls genom att kompilera i GCC och Clang sammanstÀlls i en statiskt lÀnkad universell körbar fil, som Àr lÀmplig för körning i vilken distribution som helst av Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD och till och med aktivering frÄn BIOS. Kodprojektet distribueras under ISC-licensen (en förenklad variant av MIT/BSD).
Containern för att skapa universella körbara filer Àr baserad pÄ att kombinera segmentspecifika för olika operativsystem och rubriker (PE, ELF, MACHO, OPENBSD) i en fil, vilket kombinerar flera olika format som anvÀnds i Unix, Windows och macOS. För att möjliggöra körningen av en körbar fil i Windows och Unix-system anvÀnds ett knep som involverar att koda Windows PE-filer som ett shell-skript, med hjÀlp av det faktum att Thompson Shell inte anvÀnder skriptmarkörerna "#!". För att skapa program som inkluderar flera filer (sammanstÀllning av alla resurser i en fil) stöds skapandet av en körbar fil i form av ett sÀrskilt utformat ZIP-arkiv. Schemat för det föreslagna formatet (exempel pÄ applikation 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âŠ
I början av filen anges etiketten "MZqFpD", som uppfattas som rubrik för Windows PE-formatet. Denna sekvens avkodas ocksÄ i instruktionen "pop %r10 ; jno 0x4a ; jo 0x4a", och strÀngen "\177ELF" i instruktionen "jg 0x47", som anvÀnds för att dirigera till ingÄngspunkten. I Unix-system körs shell-kod, dÀr kommandot exec anvÀnds med överlÄtelse av körbar kod genom en namnlös kanal. En begrÀnsning av den föreslagna metoden Àr att körning i Unix-liknande operativsystem endast Àr möjligt med hjÀlp av skal som stöder kompatibilitetslÀget med Thompson Shell.
Anropet qemu-x86_64 Àr avsett för att uppnÄ ytterligare portabilitet och möjliggör körning av kod kompilerad för x86_64-arkitekturen pÄ plattformar som inte Àr x86, till exempel pÄ Raspberry Pi-kort och enheter frÄn Apple, utrustade med ARM-processorer. Projektet kan ocksÄ anvÀndas för att skapa fristÄende applikationer som fungerar utan operativsystem (bare metal). I sÄdana applikationer kopplas en bootloader till den exekverbara filen, och programmet fungerar som det bootbara operativsystemet.
I det standard C-bibliotek som utvecklas av projektet libc föreslĂ„s 2024 funktioner (i det första utskicket fanns det omkring 1400 funktioner). Cosmopolitan presterar lika snabbt som glibc och övertrĂ€ffar tydligt Musl och Newlib, samtidigt som Cosmopolitan Ă€r betydligt mindre i kodstorlek Ă€n glibc och ungefĂ€r motsvarar Musl och Newlib. För att optimera ofta anropade funktioner som memcpy och strlen anvĂ€nds dessutom en teknik som kallas âtrickle-down performanceâ, dĂ€r en makro-wrapper anvĂ€nds för funktionsanropet, vilket informerar kompileraren om de CPU-register som anvĂ€nds under körningen, vilket sparar resurser genom att endast spara de förĂ€nderliga registren.
Bland förÀndringarna i den nya versionen:
- Schemat för att nĂ„ interna resurser inom zip-filer har Ă€ndrats (vid öppning av filer anvĂ€nds nu vanliga sökvĂ€gar /zip/⊠istĂ€llet för att referera med prefixet zip:..). PĂ„ liknande sĂ€tt har möjlighet till anvĂ€ndning av sökvĂ€gar av typen â/c/âŠâ istĂ€llet för âC:/âŠâ införts för Ă„tkomst till diskar i Windows.
- En ny bootloader APE (Actually Portable Executable) har föreslagits, som definierar formatet för universella exekverbara filer. Den nya bootloadern anvÀnder mmap för att placera programmet i minnet och Àndrar inte innehÄllet i realtid. Om det behövs kan den universella exekverbara filen konverteras till vanliga exekverbara filer som Àr kopplade till specifika plattformar.
- PÄ Linux-plattformen har möjligheten att anvÀnda kÀrnmodulen binfmt_misc för att köra APE-program implementerats. Det pÄpekas att anvÀndningen av binfmt_misc Àr den snabbaste metoden för att köra.
- För Linux föreslÄs en implementation av systemanropen pledge() och unveil(), som utvecklas av OpenBSD-projektet. Ett API erbjuds för att anvÀnda dessa anrop i program skrivna i C, C++, Python och Redbean, samt verktyget pledge.com för att isolera godtyckliga processer.
- För kompilering anvĂ€nds verktyget Landlock Make â en version av GNU Make med strĂ€ngare beroendekontroll och anvĂ€ndning av systemanropet Landlock för att isolera programmet frĂ„n resten av systemet och öka cache-effektiviteten. Möjligheten att kompilera med vanlig GNU Make har bevarats som ett alternativ.
- Funktioner för multitrĂ„dning har implementerats â _spawn() och _join(), som utgör universella wrapper runt API:er specifika för olika operativsystem. Arbetet med att implementera stöd för POSIX-trĂ„dar pĂ„gĂ„r.
- Det har tillhandahÄllits möjlighet att anvÀnda nyckelordet _Thread_local för att anvÀnda separata lagringsutrymmen för varje trÄd (TLS, Thread-Local Storage). Som standard initialiserar C-runtime TLS för huvudtrÄden, vilket har lett till att den minimi storlek pÄ den körbara filen har ökat frÄn 12 till 16 KB.
- I de körbara filerna har stöd för parametrarna "âftrace" och "âstrace" lagts till för att skriva ut information om alla funktions- och systemanrop till stderr.
- Stöd för systemanropet closefrom() har lagts till, vilket stöds i Linux 5.9+, FreeBSD 8+ och OpenBSD.
- PÄ Linux-plattformen har prestandan för anropen clock_gettime och gettimeofday ökat upp till 10 gÄnger tack vare anvÀndningen av vDSO (virtual dynamic shared object) mekanismen, som gör det möjligt att flytta systemanropsbehandlaren till anvÀndutrymmet och undvika kontextbyten.
- Matematiska funktioner för arbete med komplexa tal har överförts frÄn Musl-biblioteket. MÄnga matematiska funktioner har blivit snabbare.
- Funktionen nointernet() har föreslagits för att stÀnga av nÀtverksfunktioner.
- Nya funktioner för effektiv strÀngsammanfogning har lagts till: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf och vappendf.
- En sÀker variant av familjen funktioner kprintf() har lagts till, avsedd för anvÀndning med höjda privilegier.
- Prestandan för implementationerna har ökat avsevÀrt SSL, SHA, curve25519 och RSA.
KĂ€lla: opennet.ru
