Udgivelsen af projektet Cosmopolitan 2.0 er offentliggjort og udvikler standard C-biblioteket samt et universelt format for eksekverbare filer, som kan bruges til at distribuere programmer til forskellige operativsystemer uden brug af fortolkere og virtuelle maskiner. Resultatet, der opnås ved hjælp af kompilering i GCC og Clang, sammenføres til en statisk linket universel eksekverbar fil, der kan køre på enhver distribution af Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD og endda kaldes fra BIOS. Koden fra projektet distribueres under ISC-licensen (en forenklet variant af MIT/BSD).
Containeren til at skabe universelle eksekverbare filer er baseret på kombinationen af segmenter og headere specifikke for forskellige operativsystemer (PE, ELF, MACHO, OPENBSD) i én fil, ved at kombinere flere forskellige formater, der anvendes i Unix, Windows og macOS. For at sikre, at én eksekverbar fil kan køre i Windows og Unix-systemer, anvendes et trick, der involverer kodning af Windows PE-filer som et shell-script, idet Thompson Shell ikke anvender script-markøren «#!». For at skabe programmer, der inkluderer flere filer (sammenlægning af alle ressourcer i én fil), understøttes oprettelsen af den eksekverbare fil som en specielt formateret ZIP-arkiv. Skemaet for det foreslåede format (eksempel på applikationen 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 starten af filen angives mærket «MZqFpD», som opfattes som headeren for Windows PE-formatet. Denne sekvens dekodes også i instruksen «pop %r10 ; jno 0x4a ; jo 0x4a», og strengen «\177ELF» i instruksen «jg 0x47», som anvendes til at videresende til indgangspunktet. I Unix-systemer udføres shell-kode, hvor kommandoen exec bruges til at overføre den eksekverbare kode via en anonym kanal. En begrænsning ved den foreslåede metode er, at den kun kan køres i Unix-lignende OS ved hjælp af shells, der understøtter kompatibilitetsmode med Thompson Shell.
Kaldet qemu-x86_64 er designet til at implementere yderligere portabilitet og tillader kørsel af kode, der er kompileret til x86_64-arkitekturen, på platforme, der ikke er x86, for eksempel på Raspberry Pi boards og Apple-enheder udstyret med ARM-processorer. Projektet kan også bruges til at skabe selvstændige applikationer, der kører uden operativsystem (bare metal). I sådanne applikationer vedhæftes en bootloader til den eksekverbare fil, og programmet fungerer som et bootbart operativsystem.
I det udviklede standard C-bibliotek libc foreslås 2024 funktioner (i den første udgave var der omkring 1400 funktioner). Med hensyn til ydeevne fungerer Cosmopolitan lige så hurtigt som glibc og overgår tydeligt Musl og Newlib, samtidig med at Cosmopolitan er væsentligt mindre i kode størrelse sammenlignet med glibc og omtrent svarer til Musl og Newlib. For at optimere ofte kaldte funktioner som memcpy og strlen anvendes desuden teknikken 'trickle-down performance', hvor der til funktionens kald anvendes en makro-wrapper, der informerer compileren om de CPU-register, der bruges under kørsel af koden, hvilket sparer ressourcer ved at gemme kun de ændrede registre.
Blandt ændringerne i den nye udgave:
- Adgangsmetoden til interne ressourcer inden for zip-filen er ændret (når filer åbnes, bruges der nu almindelige stier /zip/... i stedet for at tilgå via præfiks zip:..). Tilsvarende for adgang til drev i Windows er det muligt at bruge stier som '/c/...' i stedet for 'C:/...'.
- Den nye loader APE (Actually Portable Executable) er blevet foreslået, som definerer formatet for universelle eksekverbare filer. Den nye loader bruger mmap til at placere programmet i hukommelsen og ændrer ikke indholdet undervejs. Om nødvendigt kan den universelle eksekverbare fil konverteres til almindelige eksekverbare filer, der er bundet til specifikke platforme.
- På Linux-platformen er muligheden for at bruge binfmt_misc kernelmodulet til at køre APE-programmer blevet implementeret. Det bemærkes, at brugen af binfmt_misc er den hurtigste metode til at starte.
- Der er tilbudt en implementering af funktionaliteten af systemopkaldene pledge() og unveil(), udviklet af OpenBSD-projektet. Der leveres et API til brug af disse kald i programmer på C, C++, Python og Redbean samt et værktøj pledge.com til isolering af vilkårlige processer.
- For samling anvendes værktøjet Landlock Make - en fork af GNU Make med strengere afhængighedskontrol og brug af systemopkaldet Landlock til at isolere programmet fra resten af systemet og forbedre cache-effektiviteten. Muligheden for at bygge med den almindelige GNU Make er bevaret som en valgmulighed.
- Der er implementeret funktioner til multitrådning - _spawn() og _join(), som udgør generiske wrappers over specifikke API'er for forskellige operativsystemer. Der arbejdes også på at implementere support til POSIX-tråde.
- Der er tilføjet muligheden for at bruge nøgleordet _Thread_local til at have separate lagre for hver tråd (TLS, Thread-Local Storage). Som standard initialiserer C-runtime TLS for hovedtråden, hvilket har medført en stigning i den mindste størrelse af det eksekverbare fil fra 12 til 16 KB.
- Der er tilføjet support til parametrene "—ftrace" og "—strace" i de eksekverbare filer for at udskrive oplysninger om alle funktions- og systemopkald til stderr.
- Der er tilføjet support til systemopkaldet closefrom(), som understøttes i Linux 5.9+, FreeBSD 8+ og OpenBSD.
- På Linux-platformen er ydelsen for opkaldene clock_gettime og gettimeofday blevet op til 10 gange forbedret ved at udnytte vDSO (virtual dynamic shared object) mekanismen, som muliggør at flytte håndteringen af systemopkaldet ind i brugerens rum og undgå kontekstskift.
- Matematiske funktioner til arbejde med komplekse tal er blevet overført fra Musl-biblioteket. Ydelsen for mange matematiske funktioner er blevet forbedret.
- Der er tilbudt en funktion nointernet(), der deaktiverer netværksmuligheder.
- Nye funktioner til effektiv strengvedhæftning er tilføjet: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf og vappendf.
- En beskyttet variant af familie af funktioner kprintf() er tilføjet, designet til at fungere under højere privilegier.
- Ydelsen for implementeringerne er væsentligt forbedret SSL, SHA, curve25519 og RSA.
Kilde: opennet.ru
