Është publikuar versioni i projektit Cosmopolitan 2.0, i cili zhvillon bibliotekën standard të C dhe formatin univers të skedarëve ekzekutivë, të cilin mund ta përdorni për shpërndarjen e programeve për sisteme të ndryshme operative pa përdorur interpreterë dhe makina virtuale. Rezultati i marrë përmes kompikimit në GCC dhe Clang është i ndërtuar në një skedar ekzekutiv univers të lidhur statikisht, i cili është i përshtatshëm për të nyjtuar në çdo shpërndarje Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD, madje edhe thirret nga BIOS. Kodi i projektit shpërndahet nën licencën ISC (një version i thjeshtuar i MIT/BSD).
Konteineri për formimin e skedarëve ekzekutivë univers është i bazuar në kombinimin e segmenteve dhe titujve specifikë për sisteme të ndryshme operative (PE, ELF, MACHO, OPENBSD) në një skedar, duke kombinuar në të disa formate të ndryshme që përdoren në Unix, Windows dhe macOS. Për të siguruar ekzekutimin e një skedari ekzekutiv në Windows dhe sistemet Unix, aplikohet një nqëllim që lidhet me kodimin e skedarëve Windows PE si një skenar shell, duke përfituar nga fakti se Thompson Shell nuk përdor treguesin e skenarëve «#!». Për të krijuar programe që përfshijnë disa skedarë (kompozimi i të gjithë burimeve në një skedar), mbështetet formimi i skedarit ekzekutiv si një arkiv ZIP i dizajnuar posaçërisht. Schemat e formatit të propozuar (shembulli i aplikacionit hello.com):
MZqFpD=’ BIOS BOOT SECTOR’ exec 7 $(command -v $0) printf ‘\177ELF…HEAD-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…
Fillimisht, skedari tregoi etiketën «MZqFpD», e cila perceptohet si titulli i formatit Windows PE. Kjo sekuencë gjithashtu dekodohet në instruktionin «pop %r10 ; jno 0x4a ; jo 0x4a», dhe stringu «\177ELF» në instruktionin «jg 0x47», të cilat përdoren për kalimin në pikën e hyrjes. Në sistemet Unix, ekzekutohet kodi shell, në të cilin përdoret komanda exec me kalimin e kodit ekzekutiv përmes një kanali të paemruar. Kufizimi i metodës së propozuar është mundësia e ekzekutimit në OS të ngjashme me Unix vetëm duke përdorur shell-e që mbështesin modin e pajtueshmërisë me Thompson Shell.
Thirrja e qemu-x86_64 është parashikuar për të realizuar portabilitet të shtuar dhe lejon ekzekutimin e kodit të kompiliuar për arkitekturën x86_64 në platforma të tjera përveç x86, si në pllakëza Raspberry Pi dhe pajisje Apple të pajisura me procesorë ARM. Projekti gjithashtu mund të përdoret për të krijuar aplikacione autonome që punojnë pa një sistem operativ (bare metal). Në këto aplikacione, një ngarkues i bashkangjitet skedarit të ekzekutueshëm dhe programi vepron si një sistem operativ që ngarkohet.
Në bibliotekën standarde të zhvilluar nga projekti, libc ofrohen 2024 funksione (në numrin e parë kishte rreth 1400 funksione). Nga pikëpamja e performancës, Cosmopolitan punon po aq shpejt sa glibc dhe i përgjigjet dukshëm Musl dhe Newlib, meqë Cosmopolitan ka një madhësi kodi që është një rend më e vogël se glibc dhe pothuajse shkon përkrah Musl dhe Newlib. Për optimizimin e funksioneve që thirren shpesh, si memcpy dhe strlen, përdoret teknika "trickle-down performance", ku për thirrjen e funksionit aplikohet një makro-përkufizues, në të cilën kompajleri njofton për regjistrat e CPU të angazhuar gjatë ekzekutimit të kodit, duke lejuar kështu ruajtjen e burimeve përmes ruajtjes vetëm të regjistrave të modifikueshëm.
Mes ndryshimeve në versionin e ri:
- Schemi i aksesit ndaj burimeve të brendshme brenda skedarit zip është ndryshuar (në hapjen e skedarëve tani përdoren rrugë të zakonshme /zip/... në vend të përdorimit të prefiksit zip:..). Po ashtu, për aksesin në disqet në Windows është ofruar mundësia e përdorimit të rrugëve të tilla " /c/..." në vend të "C:/...".
- Një ngarkues i ri APE (Actually Portable Executable) është propozuar, i cili përcakton formatin e skedarëve të ekzekutueshëm universale. Ngarkuesi i ri përdor mmap për ta vendosur programin në memorje dhe nuk e ndryshon më përmbajtjen në flakë. Nëse është e nevojshme, skedari universale i ekzekutueshëm mund të konvertohet në skedarë të zakonshëm ekzekutues, të lidhur me platforma të veçanta.
- Në platformën Linux është realizuar mundësia e përdorimit të modulit të bërthamës binfmt_misc për të ekzekutuar programe APE. Theksohet se përdorimi i binfmt_misc është metoda më e shpejtë për të nisur.
- Për Linux është propozuar një implementim i funksionaliteteve të thirrjeve sistemore pledge() dhe unveil(), që zhvillohen nga projekti OpenBSD. Ofron një API për përdorimin e këtyre thirrjeve në programe në gjuhët C, C++, Python dhe Redbean, si dhe një utilitar pledge.com për izolimin e proceseve të rastësishme.
- Për ndërtim është përdorur utilitari Landlock Make — një redaktim i GNU Make me verifikim më të rreptë të varësive dhe përdorimin e thirrjes sistemore Landlock për të izoluara programin nga sistemi tjetër dhe për të rritur efikasitetin e keq-rafinimit. Si opsion, janë ruajtur mundësitë e ndërtimit edhe me GNU Make të zakonshëm.
- Janë implementuar funksionet për shumëfijezësinë — _spawn() dhe _join(), që përbëjnë mbështjellje universale mbi API specifike për sisteme të ndryshme operimi. Po ashtu, po punohet për implementimin e mbështetjes për POSIX Threads.
- Është ofruar mundësia e përdorimit të fjalës kyçe _Thread_local për përdorimin e depozita të veçantë për çdo fije (TLS, Thread-Local Storage). Në mënyrë të paracaktuar, runtime i C inicializon TLS për fijen kryesore, që ka çuar në rritjen e madhësisë minimale të skedarit ekzekutues nga 12 në 16 KB.
- Në skedarët ekzekutues është shtuar mbështetje për parametrat «—ftrace» dhe «—strace» për të nxjerrë në stderr informacionin për të gjitha thirrjet e funksioneve dhe thirrjet sistemore.
- Shtuar mbështetje për thirrjen sistemore closefrom(), e mbështetur në Linux 5.9+, FreeBSD 8+ dhe OpenBSD.
- Në platformën Linux është rritur deri në 10 herë performanca e thirrjeve clock_gettime dhe gettimeofday përmes përdorimit të mekanizmit vDSO (virtual dynamic shared object), që lejon të kalosh përpunuesin e thirrjes sistemore në hapësirën e përdoruesit dhe të shmangësh kalimet e kontekstit.
- Funksionet matematikore për punën me numra kompleksë janë transferuar nga biblioteka Musl. Shpejtësia e shumë funksioneve matematikore është përshpejtuar.
- Është propozuar funksioni nointernet(), që çon në ndalimin e mundësive rrjet.
- Shtuar funksione të reja për bashkimin efikas të strings: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf dhe vappendf.
- Shtuar një variant të sigurt të familjes së funksioneve kprintf(), i cili është projektuar për të punuar nën privilegje të larta.
- Performanca e implementimeve është rritur ndjeshëm SSL, SHA, curve25519 dhe RSA.
Burimi: opennet.ru
