Objavljen je izdanak projekta Cosmopolitan 2.0, koji razvija standardnu C biblioteku i univerzalni format izvršnih datoteka, koji se može koristiti za distribuciju programa za različite operacijske sustave bez korištenja interpreter-a i virtualnih mašina. Rezultat dobiven kompajliranjem u GCC i Clang sastavlja se u statički povezanu univerzalnu izvršnu datoteku, koja je pogodna za pokretanje na bilo kojoj distribuciji Linuxa, macOS-a, Windows-a, FreeBSD-a, OpenBSD-a, NetBSD-a, pa čak i za poziv iz BIOS-a. Kod projekta distribuira se pod ISC licencom (pojednostavljena verzija MIT/BSD).
Kontejner za oblikovanje univerzalnih izvršnih datoteka temelji se na kombinaciji specifičnih segmenata i zaglavlja za različite operacijske sustave (PE, ELF, MACHO, OPENBSD) u jednoj datoteci, kombinirajući u njoj nekoliko različitih formata koji se koriste u Unixu, Windows-u i macOS-u. Za osiguranje pokretanja jedne izvršne datoteke u Windows i Unix sustavima koristi se trik povezan s kodiranjem Windows PE datoteka u obliku shell skripte, koristeći to što Thompson Shell ne koristi oznaku skripte «#!». Za stvaranje programa koji uključuju više datoteka (kombiniranje svih resursa u jednu datoteku) podržava se oblikovanje izvršne datoteke u obliku posebno oblikovanog ZIP arhiva. Shema predloženog formata (primjer aplikacije 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…
Na početku datoteke navodi se oznaka «MZqFpD», koja se doživljava kao zaglavlje Windows PE formata. Ova sekvenca također se dekodira u instrukciju «pop %r10 ; jno 0x4a ; jo 0x4a», a niz «\177ELF» u instrukciju «jg 0x47», koje se koriste za preusmjeravanje na ulaznu točku. U Unix sustavima izvodi se shell kod, u kojem se koristi komanda exec s prijenosom izvršnog koda preko nenamjenskog cjevovoda. Ograničenje predloženog metoda je mogućnost pokretanja u Unix sličnim OS-om samo korištenjem ljuski koje podržavaju način rada kompatibilnosti s Thompson Shell-om.
Poziv qemu-x86_64 je predviđen za dodatnu prenosivost i omogućava izvršavanje kompajliranog koda za arhitekturu x86_64 na platformama koje nisu x86, poput Raspberry Pi ploča i Apple uređaja opremljenih ARM procesorima. Projekt se također može koristiti za izradu samostalnih aplikacija koje rade bez operativnog sustava (bare metal). U takvim aplikacijama, bootloader se pridružuje izvršnoj datoteci, a program služi kao učitavajući operativni sustav.
U standardnoj C biblioteci libc, koju razvija projekt, ponuđeno je 2024 funkcije (u prvom izdanju je bilo oko 1400 funkcija). Po performansama, Cosmopolitan radi jednako brzo kao glibc i znatno ubrzano od Musl i Newlib, a pritom je veličina koda Cosmopolitan-a red veličine manja od glibc-a i otprilike odgovara Musl i Newlib. Za optimizaciju često pozivanih funkcija poput memcpy i strlen, dodatno se koristi tehnika „trickle-down performance“, pri kojoj se za pozivanje funkcije koristi makro-omotač, u kojem se kompajler informira o registrima CPU koji se koriste tokom izvršenja koda, što omogućava uštedu resursa uz očuvanje stanja CPU-a čuvanjem samo promenljivih registara.
Među promjenama u novom izdanju:
- Promenjen je okvir pozivanja unutar zip datoteke (sada se za otvaranje datoteka koriste obične putanje /zip/... umesto pristupa po prefiksu zip:..). Slično tome, za pristup diskovima u Windows-u omogućena je upotreba putanja tipa „/c/...“ umesto „C:/...“.
- Predložen je novi bootloader APE (Actually Portable Executable), koji definiše format univerzalnih izvršnih datoteka. Novi bootloader koristi mmap za smeštaj programa u memoriju i više ne menja sadržaj u hodu. Ako je potrebno, univerzalna izvršna datoteka može se konvertovati u obične izvršne datoteke vezane za pojedinačne platforme.
- Na Linux platformi implementirana je mogućnost korišćenja modula jezgra binfmt_misc za pokretanje APE programa. Naglašava se da je korišćenje binfmt_misc najbrži metod pokretanja.
- Za Linux je implementirana funkcionalnost sustavnih poziva pledge() i unveil(), koja se razvija kroz projekt OpenBSD. Pruža se API za korištenje ovih poziva u programima napisanima na jezicima C, C++, Python i Redbean, kao i alat pledge.com za izolaciju proizvoljnih procesa.
- Za izradu se koristi alat Landlock Make — izdanje GNU Make s strožom provjerom ovisnosti i sustavnim pozivom Landlock za izolaciju programa od ostatka sustava i povećanje učinkovitosti keširanja. Kao opcija zadržana je mogućnost izrade običnim GNU Make.
- Implementirane su funkcije za višestruko slijedno izvođenje — _spawn() i _join(), koje predstavljaju univerzalne omotače nad specifičnim API-jem za različite operacijske sustave. Također se radi na podršci za POSIX Threads.
- Omogućena je upotreba ključne riječi _Thread_local za korištenje odvojenih pohrana za svaki niti (TLS, Thread-Local Storage). Po zadano, C runtime inicijalizira TLS za glavnu nit, što je rezultiralo povećanjem minimalne veličine izvršne datoteke s 12 na 16 KB.
- U izvršne datoteke dodana je podrška za parametre "—ftrace" i "—strace" za ispis u stderr informacija o svim pozivima funkcija i sustavnim pozivima.
- Dodana je podrška za sustavni poziv closefrom(), koji se podržava u Linux 5.9+, FreeBSD 8+ i OpenBSD.
- Na Linux platformi performanse poziva clock_gettime i gettimeofday povećane su do 10 puta zahvaljujući upotrebi mehanizma vDSO (virtual dynamic shared object), koji omogućava premještanje obradnika sustavnog poziva u korisnički prostor i izbjegavanje prebacivanja konteksta.
- Matematičke funkcije za rad s kompleksnim brojevima prenesene su iz biblioteke Musl. Ubrzan je rad mnogih matematičkih funkcija.
- Predložena je funkcija nointernet(), koja isključuje mrežne mogućnosti.
- Dodane su nove funkcije za učinkovito dodavanje nizova: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf i vappendf.
- Dodana je sigurna varijanta obitelji funkcija kprintf(), namijenjena za rad pod povišenim privilegijama.
- Značajno je povećana učinkovitost realizacija SSL, SHA, curve25519 i RSA.
Izvor: opennet.ru
