PublicÄts Cosmopolitan 2.0 projekta izlaidums, kas izstrÄdÄ standarta C bibliotÄku un universÄlu izpildÄmÄ faila formÄtu, ko var izmantot programmu izplatÄ«Å”anai dažÄdÄm operÄtÄjsistÄmÄm, neizmantojot tulkus un virtuÄlÄs maŔīnas. RezultÄts, kas iegÅ«ts, kompilÄjot GCC un Clang, tiek apkopots statiski saistÄ«tÄ universÄlÄ izpildÄmÄ failÄ, kuru var palaist jebkurÄ Linux distribÅ«cijÄ, macOS, Windows, FreeBSD, OpenBSD, NetBSD un pat izsaukt no BIOS. Projekta kods tiek izplatÄ«ts saskaÅÄ ar ISC licenci (MIT/BSD vienkÄrÅ”ota versija).
UniversÄlu izpildÄmo failu Ä£enerÄÅ”anas konteiners ir balstÄ«ts uz dažÄdÄm operÄtÄjsistÄmÄm (PE, ELF, MACHO, OPENBSD) raksturÄ«gu segmentu un galveÅu apvienoÅ”anu vienÄ failÄ, apvienojot vairÄkus dažÄdus formÄtus, ko izmanto Unix, Windows un macOS. Lai nodroÅ”inÄtu, ka Windows un Unix sistÄmÄs darbojas viens izpildÄmais fails, Windows PE faili tiek kodÄti kÄ Äaulas skripti, izmantojot to, ka Thompson Shell neizmanto skripta marÄ·ieri ā#!ā. Lai izveidotu programmas, kas ietver vairÄkus failus (saistot visus resursus vienÄ failÄ), tas atbalsta izpildÄmÄ faila veidoÅ”anu Ä«paÅ”i izveidota ZIP arhÄ«va veidÄ. PiedÄvÄtÄ formÄta shÄma (piemÄrs hello.com lietojumprogrammai):
MZqFpD='BIOS BOOT SECTOR' exec 7 $(komanda -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" iziet no 1 REÄLÄ REŽÄŖMAā¦ ELF SEGMENTIā¦ OPENBSD PIEZÄŖMEā¦ MACHO GALVESā¦ KODS UN DATIā¦ ZIP KATALOGSā¦
Faila sÄkumÄ ir norÄdÄ«ta etiÄ·ete āMZqFpDā, kas tiek uztverta kÄ Windows PE formÄta galvene. Å Ä« secÄ«ba ir atÅ”ifrÄta arÄ« instrukcijÄ āpop %r10; jno 0x4a; jo 0x4a" un rindu "\177ELF" uz instrukciju "jg 0x47", ko izmanto, lai pÄrsÅ«tÄ«tu uz ieejas punktu. Unix sistÄmas palaiž Äaulas kodu, kas izmanto komandu exec, nododot izpildÄmo kodu caur nenosauktu cauruli. PiedÄvÄtÄs metodes ierobežojums ir iespÄja darboties Unix lÄ«dzÄ«gÄs operÄtÄjsistÄmÄs, tikai izmantojot apvalkus, kas atbalsta Thompson Shell saderÄ«bas režīmu.
Izsaukums qemu-x86_64 nodroÅ”ina papildu pÄrnesamÄ«bu un ļauj kodam, kas kompilÄts x86_64 arhitektÅ«rai, darboties platformÄs, kas nav x86, piemÄram, Raspberry Pi plates un Apple ierÄ«ces, kas aprÄ«kotas ar ARM procesoriem. Projektu var izmantot arÄ«, lai izveidotu autonomas lietojumprogrammas, kas darbojas bez operÄtÄjsistÄmas (bez metÄla). Å ÄdÄs lietojumprogrammÄs izpildÄmajam failam ir pievienots sÄknÄÅ”anas ielÄdÄtÄjs, un programma darbojas kÄ sÄknÄjama operÄtÄjsistÄma.
Projekta izstrÄdÄtÄ standarta C bibliotÄka libc piedÄvÄ 2024 funkcijas (pirmajÄ laidienÄ bija aptuveni 1400 funkciju). VeiktspÄjas ziÅÄ Cosmopolitan darbojas tikpat Ätri kÄ glibc un ievÄrojami apsteidz Musl un Newlib, neskatoties uz to, ka Cosmopolitan ir par kÄrtu mazÄks koda lielums nekÄ glibc un aptuveni atbilst Musl un Newlib. Lai optimizÄtu bieži izsauktÄs funkcijas, piemÄram, memcpy un strlen, papildus tiek izmantota ātrikle-down performanceā tehnika, kurÄ funkcijas izsaukÅ”anai tiek izmantots makro saistÄ«jums, kurÄ kompilators tiek informÄts par koda izpildÄ iesaistÄ«tajiem CPU reÄ£istriem. process, kas ļauj ietaupÄ«t resursus, saglabÄjot CPU stÄvokli, saglabÄjot tikai mainÄmos reÄ£istrus.
Starp izmaiÅÄm jaunajÄ laidienÄ:
- Ir mainÄ«ta shÄma piekļuvei iekÅ”Äjiem resursiem zip failÄ (atverot failus, tagad tiek izmantoti parastie /zip/... ceļi, nevis tiek lietots zip:.. prefikss). TÄpat, lai piekļūtu diskiem sistÄmÄ Windows, ir iespÄjams izmantot tÄdus ceļus kÄ ā/c/...ā, nevis āC:/...ā.
- Ir ierosinÄts jauns APE (Actually Portable Executable) ielÄdÄtÄjs, kas nosaka universÄlo izpildÄmo failu formÄtu. Jaunais ielÄdÄtÄjs izmanto mmap, lai ievietotu programmu atmiÅÄ un vairs nemaina saturu lidojuma laikÄ. Ja nepiecieÅ”ams, universÄlo izpildÄmo failu var pÄrvÄrst parastos izpildÄmos failos, kas saistÄ«ti ar atseviŔķÄm platformÄm.
- Linux platformÄ ir iespÄjams izmantot kodola moduli binfmt_misc, lai palaistu APE programmas. JÄatzÄ«mÄ, ka binfmt_misc izmantoÅ”ana ir ÄtrÄkÄ palaiÅ”anas metode.
- Linux ir piedÄvÄta OpenBSD projekta izstrÄdÄto sistÄmas izsaukumu pledge() un unveil() funkcionalitÄtes ievieÅ”ana. Å o zvanu izmantoÅ”anai programmÄs C, C++, Python un Redbean ir nodroÅ”inÄta API, kÄ arÄ« pledge.com utilÄ«ta patvaļīgu procesu izolÄÅ”anai.
- BÅ«vÄÅ”anai tiek izmantota utilÄ«ta Landlock Make ā āāGNU Make izdevums ar stingrÄku atkarÄ«bas pÄrbaudi un Landlock sistÄmas izsaukuma izmantoÅ”anu, lai izolÄtu programmu no pÄrÄjÄs sistÄmas un uzlabotu keÅ”atmiÅas efektivitÄti. KÄ opcija tiek saglabÄta iespÄja veidot ar parasto GNU Make.
- Ir ieviestas daudzpavedienu funkcijas - _spawn() un _join(), kas ir universÄlas saistÄ«Å”anas ar API, kas raksturÄ«gas dažÄdÄm operÄtÄjsistÄmÄm. Notiek arÄ« darbs pie POSIX Threads atbalsta ievieÅ”anas.
- Ir iespÄjams izmantot atslÄgvÄrdu _Thread_local, lai katram pavedienam izmantotu atseviŔķu krÄtuvi (TLS, Thread-Local Storage). PÄc noklusÄjuma C izpildlaiks inicializÄ TLS galvenajam pavedienam, kÄ rezultÄtÄ minimÄlais izpildÄmÄ faila lielums ir palielinÄjies no 12 KB lÄ«dz 16 KB.
- Atbalsts parametriem ā--ftraceā un ā--straceā ir pievienots izpildÄmajiem failiem, lai izvadÄ«tu informÄciju par visiem funkciju izsaukumiem un sistÄmas izsaukumiem uz stderr.
- Pievienots atbalsts closefrom() sistÄmas izsaukumam, atbalstÄ«ts operÄtÄjsistÄmÄs Linux 5.9+, FreeBSD 8+ un OpenBSD.
- Linux platformÄ clock_gettime un gettimeofday zvanu veiktspÄja ir palielinÄta lÄ«dz pat 10 reizÄm, izmantojot vDSO (virtual dynamic shared object) mehÄnismu, kas ļauj pÄrvietot sistÄmas zvanu apstrÄdÄtÄju uz lietotÄja telpu un izvairÄ«ties no konteksta pÄrslÄgÅ”anas.
- MatemÄtiskÄs funkcijas darbam ar kompleksajiem skaitļiem ir pÄrvietotas no Musl bibliotÄkas. Daudzu matemÄtisko funkciju darbÄ«ba ir paÄtrinÄta.
- Funkcija nointernet() ir piedÄvÄta, lai atspÄjotu tÄ«kla iespÄjas.
- Pievienotas jaunas funkcijas efektÄ«vai virkÅu pievienoÅ”anai: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf un vappendf.
- Pievienota aizsargÄta kprintf() funkciju saimes versija, kas paredzÄta darbam ar paaugstinÄtÄm privilÄÄ£ijÄm.
- IevÄrojami uzlabota SSL, SHA, curve25519 un RSA implementÄciju veiktspÄja.
Avots: opennet.ru