A Cosmopolitan 2.0 szabványos C könyvtár kiadása, amelyet hordozható futtatható fájlokhoz fejlesztettek ki

Megjelent a Cosmopolitan 2.0 projekt kiadása, amely a szabványos C könyvtárat és egy univerzális futtatható fájlformátumot fejleszti, amellyel tolmácsok és virtuális gépek használata nélkül lehet programokat terjeszteni különböző operációs rendszerekre. A GCC-ben és Clang-ban történő fordítással kapott eredmény egy statikusan linkelt univerzális futtatható fájlba kerül, amely bármely Linux disztribúción, macOS-en, Windowson, FreeBSD-n, OpenBSD-n, NetBSD-n futtatható, sőt a BIOS-ból is meghívható. A projekt kódja az ISC licenc (az MIT/BSD egyszerűsített változata) alatt kerül terjesztésre.

Az univerzális futtatható fájlok generálására szolgáló konténer a különböző operációs rendszerekre (PE, ELF, MACHO, OPENBSD) jellemző szegmensek és fejlécek egy fájlban való kombinálásán alapul, több különböző Unix, Windows és macOS rendszerben használt formátumot kombinálva. Annak biztosítására, hogy egyetlen végrehajtható fájl fusson Windows és Unix rendszereken, egy trükk az, hogy a Windows PE fájlokat shell szkriptekként kódolják, kihasználva azt a tényt, hogy a Thompson Shell nem használja a „#!” szkriptjelölőt. Több fájlt tartalmazó programok létrehozásához (az összes erőforrást egy fájlba kapcsolva) támogatja a végrehajtható fájl létrehozását egy speciálisan kialakított ZIP archívum formájában. A javasolt formátum sémája (például hello.com alkalmazás):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(parancs -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" kilépés 1 VALÓS ÜZEMMÓDBÓL… ELF SZEGMENTEK… MEGNYITÁS MEGJEGYZÉS... MACHO FEJLESZTEK… KÓD ÉS ADATOK… ZIP KÖNYVTÁR…

A fájl elején az „MZqFpD” címke látható, amely Windows PE formátumú fejlécként jelenik meg. Ezt a sorozatot a „pop %r10; jno 0x4a ; jo 0x4a", és a "\177ELF" sort a "jg 0x47" utasításhoz, amelyek a belépési ponthoz való továbbításra szolgálnak. A Unix rendszerek olyan shell kódot futtatnak, amely az exec parancsot használja, és a végrehajtható kódot egy névtelen csövön keresztül adja át. A javasolt módszer korlátozása az, hogy Unix-szerű operációs rendszereken csak a Thompson Shell kompatibilitási módot támogató parancsértelmezőkkel lehet futtatni.

A qemu-x86_64 hívás további hordozhatóságot biztosít, és lehetővé teszi az x86_64 architektúrára fordított kódok futtatását nem x86 platformokon, például Raspberry Pi kártyákon és ARM processzorokkal felszerelt Apple eszközökön. A projekt segítségével önálló alkalmazások is létrehozhatók, amelyek operációs rendszer nélkül futnak (csupasz fém). Az ilyen alkalmazásokban a végrehajtható fájlhoz egy rendszerbetöltő csatlakozik, és a program indítható operációs rendszerként működik.

A projekt által kifejlesztett szabványos C könyvtár libc 2024 funkciót kínál (az első kiadásban körülbelül 1400 függvény volt). A teljesítmény tekintetében a Cosmopolitan olyan gyorsan működik, mint a glibc, és észrevehetően megelőzi a Musl-t és a Newlib-et, annak ellenére, hogy a Cosmopolitan kódméretben egy nagyságrenddel kisebb, mint a glibc, és megközelítőleg megfelel a Muslnak és a Newlib-nek. A gyakran hívott függvények, például a memcpy és az strlen optimalizálására ezenkívül a „trickle-down performance” technikát is alkalmazzák, amelyben a függvény meghívására egy makró kötést használnak, melyben a fordító tájékoztatást kap a kódvégrehajtásban részt vevő CPU regiszterekről. folyamat, amely lehetővé teszi az erőforrások megtakarítását a CPU állapotának mentésekor azáltal, hogy csak a módosítható regisztereket menti el.

Az új kiadás változásai között:

  • A zip fájlon belüli belső erőforrások elérésének sémája megváltozott (a fájlok megnyitásakor a szokásos /zip/... elérési utak használatosak a zip:.. előtag helyett). Hasonlóképpen, a Windows rendszerben a lemezek eléréséhez a „C:/...” helyett a „/c/...” elérési utak is használhatók.
  • Egy új APE (Actually Portable Executable) betöltőt javasoltak, amely meghatározza az univerzális futtatható fájlok formátumát. Az új betöltő az mmap segítségével helyezi el a programot a memóriában, és már nem változtatja meg a tartalmat menet közben. Ha szükséges, az univerzális futtatható fájl átalakítható normál futtatható fájlokká, amelyek egyedi platformokhoz vannak kötve.
  • Linux platformon lehetőség van APE programok futtatására a binfmt_misc kernelmodul használatával. Megjegyzendő, hogy a binfmt_misc használata a leggyorsabb indítási módszer.
  • Linux esetében javasolták az OpenBSD projekt által kifejlesztett pledge() és unveil() rendszerhívások funkcionalitásának megvalósítását. Ezen hívások C, C++, Python és Redbean programokban való használatához API-t, valamint tetszőleges folyamatok elkülönítésére szolgáló pledge.com segédprogramot biztosítunk.
  • A build a Landlock Make segédprogramot használja – a GNU Make egy olyan kiadását, amely szigorúbb függőségi ellenőrzést és a Landlock rendszerhívást használja a program elkülönítésére a rendszer többi részétől, és javítja a gyorsítótárazási hatékonyságot. Opcióként megmarad a hagyományos GNU Make-vel való építés lehetősége.
  • Megvalósították a többszálú funkciókat - _spawn() és _join(), amelyek univerzális kötések a különböző operációs rendszerekre jellemző API-kon keresztül. A POSIX Threads támogatás bevezetése is folyamatban van.
  • A _Thread_local kulcsszó használatával minden szálhoz külön tárhelyet használhat (TLS, Thread-Local Storage). Alapértelmezés szerint a C futtatókörnyezet inicializálja a TLS-t a fő szálhoz, ami miatt a végrehajtható fájl minimális mérete 12 KB-ról 16 KB-ra nőtt.
  • A „--ftrace” és a „--strace” paraméterek támogatása hozzáadásra került a végrehajtható fájlokhoz, hogy az összes funkcióhívásról és rendszerhívásról információt adjanak ki az stderr-nek.
  • Támogatás hozzáadva a closefrom() rendszerhíváshoz, támogatott Linux 5.9+, FreeBSD 8+ és OpenBSD esetén.
  • A Linux platformon a clock_gettime és gettimeofday hívások teljesítménye 10-szeresére nőtt a vDSO (virtuális dinamikus megosztott objektum) mechanizmus segítségével, amely lehetővé teszi a rendszerhíváskezelő áthelyezését a felhasználói térbe, és elkerülhető a kontextusváltás.
  • A komplex számokkal való munka matematikai függvényei átkerültek a Musl könyvtárból. Számos matematikai függvény munkája felgyorsult.
  • A nointernet() függvényt javasolták a hálózati képességek letiltására.
  • Új funkciók hozzáadva a karakterláncok hatékony hozzáfűzéséhez: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf és vappendf.
  • Hozzáadtuk a kprintf() függvénycsalád egy védett változatát, amelyet úgy terveztek, hogy emelt szintű jogosultságokkal működjön.
  • Jelentősen javult az SSL, SHA, curve25519 és RSA implementációk teljesítménye.

Forrás: opennet.ru

Hozzászólás