Release av standard C-biblioteket Cosmopolitan 2.0, utvecklat för bärbara körbara filer

Releasen av Cosmopolitan 2.0-projektet har publicerats och utvecklar standard C-biblioteket och ett universellt körbart filformat som kan användas för att distribuera program för olika operativsystem utan användning av tolkar och virtuella maskiner. Resultatet som erhålls genom att kompilera i GCC och Clang kompileras till en statiskt länkad universell körbar fil som kan köras på vilken Linux-distribution som helst, macOS, Windows, FreeBSD, OpenBSD, NetBSD och till och med anropas från BIOS. Projektkoden distribueras under ISC-licensen (en förenklad version av MIT/BSD).

Behållaren för att generera universella körbara filer är baserad på att kombinera segment och rubriker specifika för olika operativsystem (PE, ELF, MACHO, OPENBSD) i en fil, kombinera flera olika format som används i Unix, Windows och macOS. För att säkerställa att en enda körbar fil körs på Windows- och Unix-system är ett knep att koda Windows PE-filer som skalskript, och dra fördel av det faktum att Thompson Shell inte använder skriptmarkören "#!". För att skapa program som innehåller flera filer (länkar alla resurser till en fil) stöder den bildningen av en körbar fil i form av ett specialdesignat ZIP-arkiv. Schema för det föreslagna formatet (exempel hello.com-applikation):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(kommando -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" avsluta 1 RIKTIGT LÄGE... ELF-SEGMENT... OPENBSD NOTERA... MACHO-RUBBRUKAR... KOD OCH DATA... ZIP-KATALOG...

I början av filen indikeras etiketten "MZqFpD", som uppfattas som en rubrik i Windows PE-format. Denna sekvens avkodas också i instruktionen “pop %r10; jno 0x4a ; jo 0x4a", och raden "\177ELF" till instruktionen "jg 0x47", som används för att vidarebefordra till ingångspunkten. Unix-system kör skalkod som använder kommandot exec och skickar den körbara koden genom ett namnlöst rör. En begränsning av den föreslagna metoden är möjligheten att köra på Unix-liknande operativsystem endast med skal som stöder Thompson Shell-kompatibilitetsläge.

Anropet qemu-x86_64 ger ytterligare portabilitet och tillåter kod som kompilerats för x86_64-arkitekturen att 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 starthanterare kopplad till den körbara filen, och programmet fungerar som ett startbart operativsystem.

Standard C-biblioteket libc som utvecklats av projektet erbjuder 2024 funktioner (i den första utgåvan fanns det 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 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 tekniken "trickle-down performance", där en makrobindning används för att anropa funktionen, där kompilatorn informeras om CPU-registren som är involverade i kodexekveringen process, som gör det möjligt att spara resurser när du sparar CPU-tillstånd genom att endast spara ändringsbara register.

Bland ändringarna i den nya utgåvan:

  • Schemat för att komma åt interna resurser i en zip-fil har ändrats (när filer öppnas används nu de vanliga /zip/...-sökvägarna istället för att använda prefixet zip:..). På liknande sätt, för att komma åt diskar i Windows, är det möjligt att använda sökvägar som "/c/..." istället för "C:/...".
  • En ny APE (Actually Portable Executable) laddare 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. Om det behövs kan den universella körbara filen konverteras till vanliga körbara filer kopplade till enskilda plattformar.
  • På Linux-plattformen är det möjligt att använda kärnmodulen binfmt_misc för att köra APE-program. Det noteras att användning av binfmt_misc är den snabbaste startmetoden.
  • För Linux har en implementering av funktionaliteten för systemanropen pledge() och unveil() som utvecklats av OpenBSD-projektet föreslagits. Ett API tillhandahålls för att använda dessa anrop i program i C, C++, Python och Redbean, samt ett pledge.com-verktyg för att isolera godtyckliga processer.
  • Bygget använder verktyget Landlock Make - en utgåva av GNU Make med strängare beroendekontroll och användning av Landlock-systemanropet för att isolera programmet från resten av systemet och förbättra cachningseffektiviteten. Som ett alternativ behålls möjligheten att bygga med vanliga GNU Make.
  • Funktioner för multithreading har implementerats - _spawn() och _join(), som är universella bindningar över API:er som är specifika för olika operativsystem. Arbete pågår också för att implementera POSIX Threads-stöd.
  • Det är möjligt att använda nyckelordet _Thread_local för att använda separat lagring för varje tråd (TLS, Thread-Local Storage). Som standard initierar C-runtime TLS för huvudtråden, vilket har fått den minsta körbara storleken att öka från 12 KB till 16 KB.
  • Stöd för parametrarna "--ftrace" och "--strace" har lagts till i körbara filer för att mata ut information om alla funktionsanrop och systemanrop till stderr.
  • Lade till stöd för systemanropet closefrom(), som stöds på Linux 5.9+, FreeBSD 8+ och OpenBSD.
  • På Linux-plattformen har prestandan för clock_gettime och gettimeofday-anrop ökats upp till 10 gånger genom att använda vDSO-mekanismen (virtual dynamic shared object), som 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 flyttats från Musl-biblioteket. Arbetet med många matematiska funktioner har påskyndats.
  • Funktionen nointernet() har föreslagits för att inaktivera nätverksfunktioner.
  • Lade till nya funktioner för att effektivt lägga till strängar: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf och vappendf.
  • Lade till en skyddad version av kprintf()-familjen av funktioner, designad för att fungera med förhöjda privilegier.
  • Betydligt förbättrad prestanda för SSL-, SHA-, curve25519- och RSA-implementeringar.

Källa: opennet.ru

Lägg en kommentar