Išleistas projektas „Cosmopolitan 2.0“, kuris kuria standartinę C biblioteką ir universalų vykdomąjį formatą, kurį galima naudoti programoms platinti skirtingose operacinėse sistemose be interpretatorių ar virtualių mašinų. Kompiliavimas naudojant GCC ir Clang sukuria statiškai susietą universalų vykdomąjį failą, kuris gali veikti bet kuriame distribucijoje. Linux, macOS, Windows, „FreeBSD“, „OpenBSD“, „NetBSD“ ir net prieiga prie BIOS. Projekto kodas platinamas pagal ISC licenciją (supaprastintą MIT/BSD licencijos versiją).
Universalių vykdomųjų failų formavimo konteineris pagrįstas skirtingoms operacinėms sistemoms būdingų segmentų ir antraščių (PE, ELF, MACHO, OPENBSD) sujungimu viename faile, sujungiant kelis skirtingus Unix sistemoje naudojamus formatus. Windows и macOSSiekiant užtikrinti, kad būtų galima paleisti vieną vykdomąjį failą Windows ir „Unix“ sistemos naudoja su failų kodavimu susijusį triuką Windows PE kaip apvalkalo scenarijų, pasinaudojant tuo, kad „Thompson Shell“ neturi scenarijaus žymeklio „#!“. Norint sukurti programas, kuriose yra keli failai (sujungiant visus išteklius į vieną failą), vykdomąjį failą galima sukurti kaip specialiai suformatuotą ZIP archyvą. Siūlomas formatas (pavyzdys: hello.com programa):
MZqFpD='BIOS BOOT SECTOR' exec 7 $(komanda -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" išeiti iš 1 TIKRŲJŲ REŽIMŲ... ELF SEGMENTAI... ATIDARYTI PASTABA... MACHO ANTRAŠTĖS... KODAS IR DUOMENYS... ZIP KATALOGAS...
Failo pradžioje nurodoma etiketė „MZqFpD“, kuri suvokiama kaip formato antraštė. Windows PE. Ši seka taip pat dekoduojama į instrukciją „pop %r10 ; jno 0x4a ; jo 0x4a“, o eilutė „\177ELF“ – į instrukciją „jg 0x47“, kurios naudojamos peradresavimui į įėjimo tašką. Unix sistemose apvalkalo kodas vykdomas naudojant exec komandą, perduodant vykdomąjį kodą per neįvardintą kanalą. Siūlomo metodo apribojimas yra tas, kad jį galima vykdyti tik Unix tipo operacinėse sistemose, naudojant apvalkalus, kurie palaiko „Thompson Shell“ suderinamumo režimą.
Iškvietimas qemu-x86_64 suteikia papildomo perkeliamumo ir leidžia x86_64 architektūrai sudarytam kodui veikti ne x86 platformose, pvz., Raspberry Pi plokštėse ir Apple įrenginiuose su ARM procesoriais. Projektas taip pat gali būti naudojamas kuriant savarankiškas programas, veikiančias be operacinės sistemos (be metalo). Tokiose programose prie vykdomojo failo pridedamas įkrovos įkroviklis, o programa veikia kaip paleidžiama operacinė sistema.
Projekto sukurta standartinė C biblioteka libc siūlo 2024 funkcijas (pirmoje laidoje buvo apie 1400 funkcijų). Kalbant apie našumą, „Cosmopolitan“ veikia taip pat greitai kaip „glibc“ ir pastebimai lenkia „Musl“ ir „Newlib“, nepaisant to, kad „Cosmopolitan“ kodo dydis yra daug mažesnis nei „glibc“ ir maždaug atitinka „Musl“ ir „Newlib“. Norint optimizuoti dažnai vadinamas funkcijas, tokias kaip memcpy ir strlen, papildomai naudojama „trikle-down performance“ technika, kurioje funkcijai iškviesti naudojamas makrokomandos susiejimas, kurio metu kompiliatorius informuojamas apie CPU registrus, dalyvaujančius vykdant kodą. procesas, leidžiantis taupyti resursus išsaugant CPU būseną, išsaugant tik keičiamus registrus.
Tarp naujojo leidimo pakeitimų:
- Pakeista ZIP failo vidinių išteklių prieigos schema (atidarant failus, dabar naudojami įprasti keliai /zip/…, o ne prieiga prie zip:.. prefikso). Panašiai ir norint pasiekti diskus Windows Įvesta galimybė naudoti tokius kelius kaip „/c/...“ vietoj „C:/...“.
- Pasiūlytas naujas APE (Actually Portable Executable) įkroviklis, kuris apibrėžia universalių vykdomųjų failų formatą. Naujasis įkroviklis naudoja mmap programą, kad patalpintų programą į atmintį ir nebekeičia turinio. Jei reikia, universalų vykdomąjį failą galima konvertuoti į įprastus vykdomuosius failus, susietus su atskiromis platformomis.
- Ant platformos Linux Įdiegta galimybė naudoti branduolio modulį „binfmt_misc“ APE programoms paleisti. Pažymėtina, kad „binfmt_misc“ naudojimas yra greičiausias paleidimo būdas.
- Už Linux Siūlomas „OpenBSD“ projekto sukurtų sisteminių iškvietimų „pledge()“ ir „unevale()“ įgyvendinimas. Pateikiama API sąsaja, skirta naudoti šiuos iškvietimus C, C++, Python ir Redbean programose, taip pat „pledge.com“ programa savavališkiems procesams izoliuoti.
- Konstrukcijoje naudojama „Landlock Make“ priemonė – „GNU Make“ leidimas su griežtesniu priklausomybės tikrinimu ir „Landlock“ sistemos iškvietimu, siekiant atskirti programą nuo likusios sistemos ir pagerinti talpyklos efektyvumą. Galimybė kurti naudojant įprastą GNU Make išlaikoma kaip parinktis.
- Įdiegtos kelių gijų funkcijos – _spawn() ir _join(), kurios yra universalios API sąsajos, būdingos skirtingoms operacinėms sistemoms. Taip pat vyksta POSIX Threads palaikymo diegimas.
- Galima naudoti raktinį žodį _Thread_local, kad kiekvienai gijai būtų naudojama atskira saugykla (TLS, Thread-Local Storage). Pagal numatytuosius nustatymus C vykdymo laikas inicijuoja pagrindinės gijos TLS, todėl minimalus vykdomojo failo dydis padidėjo nuo 12 KB iki 16 KB.
- Parametrai „--ftrace“ ir „--strace“ buvo įtraukti į vykdomuosius failus, kad būtų išvesta informacija apie visus funkcijų iškvietimus ir sistemos iškvietimus į stderr.
- Pridėta palaikymo funkcija sistemos iškvietimui closefrom(), palaikoma Linux 5.9+, „FreeBSD 8+“ ir „OpenBSD“.
- Ant platformos Linux „Clock_gettime“ ir „gettimeofday“ iškvietimų našumas padidintas iki 10 kartų naudojant vDSO (virtualaus dinaminio bendro naudojimo objekto) mechanizmą, kuris leidžia perkelti sistemos iškvietimų tvarkyklę į vartotojo erdvę ir išvengti konteksto perjungimo.
- Matematinės funkcijos, skirtos darbui su kompleksiniais skaičiais, buvo perkeltos iš Musl bibliotekos. Daugelio matematinių funkcijų darbas buvo pagreitintas.
- Funkcija nointernet() buvo pasiūlyta išjungti tinklo galimybes.
- Pridėtos naujos funkcijos, skirtos efektyviai pridėti eilutes: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf ir vappendf.
- Pridėta apsaugota kprintf() funkcijų šeimos versija, skirta dirbti su padidintomis privilegijomis.
- Žymiai pagerintas diegimų našumas SSL, SHA, kreivė 25519 ir RSA.
Šaltinis: opennet.ru
