Megjelent a Cosmopolitan 2.0 projekt kiadása, amely a standard C könyvtárat és egy egyetemes futtatható fájlformátumot fejleszt, amelyet különböző operációs rendszerek számára lehet használni közvetítők és virtuális gépek nélkül. A GCC és Clang segítségével történő fordítással előállított eredmény egy statikusan linkelhető univerzális futtatható fájlba kerül, amely bármely Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD disztribúcióban elindítható, sőt BIOS-ból is hívható. A projekt kódját ISC licenc alatt terjesztik (a MIT/BSD egyszerűsített változata).
A univerzális futtatható fájlok előállításához szükséges konténer különböző operációs rendszerekre jellemző szegmensek és fejlécek (PE, ELF, MACHO, OPENBSD) egy fájlba való kombinálásán alapul, több különböző formátumot egyesítve, melyek Unix, Windows és macOS környezetben használatosak. Az egységes futtatható fájl Windows és Unix rendszerekben való futtatásához egy trükköt alkalmaznak, amely a Windows PE fájlok shell-skriptként való kódolásán alapul, figyelembe véve, hogy a Thompson Shell nem használ „#!” skriptmárt. Olyan programok létrehozásához, amelyek több fájlt tartalmaznak (az összes erőforrás egy fájlba való kombinálása), támogatott, hogy a futtatható fájl egy speciálisan formázott ZIP-archívum formájában álljon elő. Az ajánlott formátum sémája (példa: hello.com alkalmazás):
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…
A fájl elején található a „MZqFpD” címke, amely Windows PE formátumként értelmezhető. Ez a sor dekódolható az „pop %r10 ; jno 0x4a ; jo 0x4a” utasításokra, míg a „\177ELF” a „jg 0x47” utasításra, melyek a belépési pontra való ugráshoz használatosak. Unix rendszerekben shell-kód fut, amelyben az exec paranccsal adják át a végrehajtandó kódot egy névtelen csatornán. A javasolt módszer korlátja, hogy Unix-szerű operációs rendszerekben csak olyan shell-ek használatával indítható, amelyek támogatják a Thompson Shell kompatibilitási módját.
A qemu-x86_64 hívást a további hordozhatóság megvalósítására tervezték, és lehetővé teszi az x86_64 architektúrára lefordított kód futtatását olyan platformokon, amelyek különböznek az x86-tól, például Raspberry Pi alaplapokon és ARM processzorral rendelkező Apple eszközökön. A projekt emellett felhasználható önálló alkalmazások létrehozására, amelyek operációs rendszer nélkül működnek (bare metal). Az ilyen alkalmazásokhoz egy betöltőprogramot csatolnak az végrehajtható fájlhoz, míg a program a betöltendő operációs rendszer szerepét tölti be.
A projekt által fejlesztett szabvány C könyvtárban, a libc-ban összesen 2024 funkció található (az első kiadásban körülbelül 1400 funkció volt). Teljesítmény szempontjából a Cosmopolitan éppolyan gyors, mint a glibc, és jelentősen felülmúlja a Musl-t és a Newlib-et, míg a Cosmopolitan kódmérete tízszer kisebb a glibc-hoz képest, és körülbelül megfelel a Musl-nak és a Newlib-nek. A gyakran hívott funkciók, mint például a memcpy és a strlen optimalizálására a "trickle-down performance" technikát alkalmazzák, amely során a funkcióhívás egy makróbevonattal történik, amely tájékoztatja a fordítót az végrehajtás során használt CPU regiszterekről, így erőforrást takarít meg a CPU állapotának megőrzésével azzal, hogy csak a módosított regisztereket menti.
A legújabb verzióban bekövetkezett változások:
- Megváltozott a belső erőforrásokhoz való hozzáférés rendszere a zip fájlban (a fájlok megnyitásakor mostantól normál útvonalakat használnak /zip/... formátumban a zip:... előtag helyett). Hasonlóan a Windows lemezekhez való hozzáféréshez lehetőség van az "\/c\/..." formátumú útvonalak használatára a "C:\..." helyett.
- Új APE (Actually Portable Executable) betöltőprogramot javasoltak, amely meghatározza az univerzális végrehajtható fájlok formátumát. Az új betöltőprogram mmap-ot használ a program memóriahelyének elkülönítésére, és már nem módosítja a tartalmat futás közben. Szükség esetén az univerzális végrehajtható fájl hagyományos végrehajtható fájlokká alakítható, amelyek egyes platformokhoz vannak kötve.
- Linux platformon megvalósították a binfmt_misc kernel modul használatát az APE programok futtatásához. Megjegyzik, hogy a binfmt_misc használata a leggyorsabb módszer a futtatásra.
- Linux alatt implementálták a pledge() és unveil() rendszerhívások funkcionalitását, amelyet az OpenBSD projekt fejleszt. API áll rendelkezésre ezeknek a hívásoknak a használatához C, C++, Python és Redbean nyelveken, valamint a pledge.com segédprogram, amely lehetővé teszi tetszőleges folyamatok izolálását.
- A Landlock Make eszköz van használva a fordításhoz — a GNU Make egy módosított változata, amely szigorúbb függőségi ellenőrzést és a Landlock rendszerhívás használatát alkalmazza a programok izolálására a többi rendszertől, ezzel növelve a gyorsítótárazás hatékonyságát. Az alapértelmezett GNU Make fordítási lehetőségei is megtarthatók.
- Megvalósultak a több szálú működést biztosító _spawn() és _join() függvények, amelyek egy univerzális wrapper-t jelentenek a különböző operációs rendszerek API-jai fölött. Továbbá folyamatban van a POSIX Threads támogatásának megvalósítása.
- Lehetőség nyílik a _Thread_local kulcsszó használatára, amely lehetővé teszi az egyes szálakhoz külön tárolók használatát (TLS, Thread-Local Storage). Alapértelmezés szerint a C futási környezet inicializálja a TLS-t az alap szálhoz, ami a végrehajtható fájl minimális méretének 12-ről 16 KB-ra emelkedését eredményezte.
- A végrehajtható fájlokhoz hozzáadódott az «—ftrace» és «—strace» paraméterek támogatása, amelyek lehetővé teszik a hibakimenetre (stderr) a függvény- és rendszerhívásokkal kapcsolatos információk kiírását.
- Támogatás került bevezetésre a closefrom() rendszerhívás számára, amely a Linux 5.9+, FreeBSD 8+ és OpenBSD rendszerekben elérhető.
- A Linux platformon a clock_gettime és gettimeofday hívások teljesítményét akár 10-szeresére növelték a vDSO (virtuális dinamikus megosztott objektum) mechanizmus használatával, amely lehetővé teszi a rendszerhívás kezelőjének felhasználói térbe helyezését, elkerülve a kontextusváltásokat.
- A Musl könyvtárból áthelyeztek matematikai függvényeket a komplex számok kezelésére. Számos matematikai függvény működése felgyorsult.
- Javasolt egy nointernet() függvény, amely letiltja a hálózati funkciókat.
- Új függvények kerültek bevezetésre a hatékony szövegcsatoláshoz: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf és vappendf.
- Hozzáadódott egy védett változata a kprintf() függvénycsaládnak, amely emelt jogosultságok mellett való munkára lett tervezve.
- Jelentősen növelték a megvalósítások teljesítményét SSL, SHA, curve25519 és RSA.
Forrás: opennet.ru
