Vrystelling van die Cosmopolitan 2.0-standaard C-biblioteek ontwikkel vir draagbare uitvoerbare

Die vrystelling van die Cosmopolitan 2.0-projek is gepubliseer en ontwikkel die standaard C-biblioteek en 'n universele uitvoerbare lêerformaat wat gebruik kan word om programme vir verskillende bedryfstelsels te versprei sonder die gebruik van tolke en virtuele masjiene. Die resultaat wat verkry word deur saam te stel in GCC en Clang word saamgestel in 'n staties gekoppelde universele uitvoerbare lêer wat op enige Linux-verspreiding, macOS, Windows, FreeBSD, OpenBSD, NetBSD uitgevoer kan word, en selfs vanaf die BIOS geroep kan word. Die projekkode word versprei onder die ISC-lisensie ('n vereenvoudigde weergawe van MIT/BSD).

Die houer vir die generering van universele uitvoerbare lêers is gebaseer op die kombinasie van segmente en kopskrifte spesifiek vir verskillende bedryfstelsels (PE, ELF, MACHO, OPENBSD) in een lêer, wat verskeie verskillende formate wat in Unix, Windows en macOS gebruik word, kombineer. Om te verseker dat 'n enkele uitvoerbare lêer op Windows- en Unix-stelsels loop, is 'n truuk om Windows PE-lêers as dopskrifte te enkodeer, en benut die feit dat Thompson Shell nie die "#!"-skrifmerker gebruik nie. Om programme te skep wat verskeie lêers insluit (wat alle hulpbronne in een lêer koppel), ondersteun dit die vorming van 'n uitvoerbare lêer in die vorm van 'n spesiaal ontwerpte zip-argief. Skema van die voorgestelde formaat (voorbeeld hello.com aansoek):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(command -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" verlaat 1 REGTE MODUS... ELF-SEGMENTE... OPENBSD NOTA... MACHO-OPSKRIFTE... KODE EN DATA... Posgids...

Aan die begin van die lêer word die etiket "MZqFpD" aangedui, wat as 'n Windows PE-formaat-opskrif beskou word. Hierdie volgorde word ook gedekodeer in die instruksie “pop %r10; jno 0x4a ; jo 0x4a", en die reël "\177ELF" na die instruksie "jg 0x47", wat gebruik word om aan te stuur na die toegangspunt. Unix-stelsels loop dopkode wat die exec-opdrag gebruik, wat die uitvoerbare kode deur 'n naamlose pyp stuur. 'n Beperking van die voorgestelde metode is die vermoë om slegs op Unix-agtige bedryfstelsels te werk deur skulpe te gebruik wat Thompson Shell-versoenbaarheidsmodus ondersteun.

Die qemu-x86_64-oproep bied bykomende oordraagbaarheid en laat kode saamgestel vir die x86_64-argitektuur toe om op nie-x86-platforms te werk, soos Raspberry Pi-borde en Apple-toestelle wat met ARM-verwerkers toegerus is. Die projek kan ook gebruik word om selfstandige toepassings te skep wat sonder 'n bedryfstelsel (bare metaal) loop. In sulke toepassings word 'n selflaaiprogram aan die uitvoerbare lêer geheg, en die program dien as 'n selflaaibare bedryfstelsel.

Die standaard C-biblioteek libc wat deur die projek ontwikkel is, bied 2024 funksies (in die eerste vrystelling was daar ongeveer 1400 funksies). Wat prestasie betref, werk Cosmopolitan so vinnig soos glibc en is dit merkbaar voor Musl en Newlib, ten spyte van die feit dat Cosmopolitan 'n orde van grootte kleiner in kodegrootte as glibc is en ongeveer ooreenstem met Musl en Newlib. Om gereeld geroepe funksies soos memcpy en strlen te optimaliseer, word die "trickle-down performance" tegniek addisioneel gebruik, waarin 'n makro-binding gebruik word om die funksie op te roep, waarin die samesteller ingelig word oor die SVE-registers wat betrokke is by die kode-uitvoering proses, wat dit moontlik maak om hulpbronne te stoor wanneer SVE-toestand gestoor word deur slegs veranderlike registers te stoor.

Onder die veranderinge in die nuwe weergawe:

  • Die skema vir toegang tot interne hulpbronne binne 'n zip-lêer is verander (wanneer lêers oopgemaak word, word die gewone /zip/...-paaie nou gebruik in plaas van om die zip:..-voorvoegsel te gebruik). Net so, om toegang tot skywe in Windows te kry, is dit moontlik om paaie soos "/c/..." te gebruik in plaas van "C:/...".
  • 'n Nuwe APE (Eintlik Portable Executable) laaier is voorgestel, wat die formaat van universele uitvoerbare lêers definieer. Die nuwe laaier gebruik mmap om die program in die geheue te plaas en verander nie meer die inhoud dadelik nie. Indien nodig, kan die universele uitvoerbare lêer omgeskakel word in gewone uitvoerbare lêers wat aan individuele platforms gekoppel is.
  • Op die Linux-platform is dit moontlik om die binfmt_misc kernmodule te gebruik om APE-programme uit te voer. Daar word kennis geneem dat die gebruik van binfmt_misc die vinnigste bekendstellingsmetode is.
  • Vir Linux is 'n implementering van die funksionaliteit van die pledge() en onthulling()-stelseloproepe wat deur die OpenBSD-projek ontwikkel is, voorgestel. 'n API word voorsien vir die gebruik van hierdie oproepe in programme in C, C++, Python en Redbean, sowel as 'n pledge.com-nutsding om arbitrêre prosesse te isoleer.
  • Die bouwerk gebruik die Landlock Make-nutsding - 'n uitgawe van GNU Make met strenger afhanklikheidskontrole en die gebruik van die Landlock-stelseloproep om die program van die res van die stelsel te isoleer en kasdoeltreffendheid te verbeter. As 'n opsie word die vermoë om met gewone GNU Make te bou, behou.
  • Funksies vir multithreading is geïmplementeer - _spawn() en _join(), wat universele bindings is oor API's spesifiek vir verskillende bedryfstelsels. Werk is ook aan die gang om POSIX Threads-ondersteuning te implementeer.
  • Dit is moontlik om die sleutelwoord _Thread_local te gebruik om aparte berging vir elke draad (TLS, Thread-Local Storage) te gebruik. By verstek initialiseer die C-looptyd TLS vir die hoofdraad, wat veroorsaak het dat die minimum uitvoerbare grootte van 12 KB tot 16 KB verhoog het.
  • Ondersteuning vir die "--ftrace" en "--strace" parameters is by uitvoerbare lêers gevoeg om inligting oor alle funksie-oproepe en stelseloproepe na stderr uit te voer.
  • Bygevoeg ondersteuning vir die closefrom() stelsel oproep, ondersteun op Linux 5.9+, FreeBSD 8+ en OpenBSD.
  • Op die Linux-platform is die werkverrigting van clock_gettime en gettimeofday-oproepe tot 10 keer verhoog deur die vDSO (virtuele dinamiese gedeelde voorwerp)-meganisme te gebruik, wat dit moontlik maak om die stelseloproephanteerder na gebruikersruimte te skuif en konteksskakelaars te vermy.
  • Wiskundige funksies om met komplekse getalle te werk is uit die Musl-biblioteek geskuif. Die werk van baie wiskundige funksies is versnel.
  • Die nointernet()-funksie is voorgestel om netwerkvermoëns te deaktiveer.
  • Bygevoeg nuwe funksies om stringe doeltreffend by te voeg: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf en vappendf.
  • Bygevoeg 'n beskermde weergawe van die kprintf() familie van funksies, ontwerp om te werk met verhoogde voorregte.
  • Aansienlik verbeterde werkverrigting van SSL-, SHA-, curve25519- en RSA-implementerings.

Bron: opennet.ru

Voeg 'n opmerking