Ă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
