Gefa út staðlaða C bókasafnið Cosmopolitan 2.0, þróað fyrir flytjanlegar keyranlegar skrár

Útgáfa Cosmopolitan 2.0 verkefnisins hefur verið gefin út og þróar staðlaða C bókasafnið og alhliða executable skráarsnið sem hægt er að nota til að dreifa forritum fyrir mismunandi stýrikerfi án þess að nota túlka og sýndarvélar. Niðurstaðan sem fæst með því að safna saman í GCC og Clang er sett saman í kyrrstöðutengda alhliða keyrsluskrá sem hægt er að keyra á hvaða Linux dreifingu sem er, macOS, Windows, FreeBSD, OpenBSD, NetBSD, og ​​jafnvel hringja úr BIOS. Verkefniskóðanum er dreift undir ISC leyfinu (einfölduð útgáfa af MIT/BSD).

Gámurinn til að búa til alhliða keyrsluskrár byggist á því að sameina hluti og hausa sem eru sérstakir fyrir mismunandi stýrikerfi (PE, ELF, MACHO, OPENBSD) í einni skrá og sameina nokkur mismunandi snið sem notuð eru í Unix, Windows og macOS. Til að tryggja að ein keyranleg skrá keyri á Windows og Unix kerfum er bragð að umrita Windows PE skrár sem skeljaforskriftir og nýta þá staðreynd að Thompson Shell notar ekki "#!" forskriftarmerkið. Til að búa til forrit sem innihalda nokkrar skrár (tengja allar auðlindir í eina skrá) styður það myndun keyranlegrar skráar í formi sérhannaðs ZIP skjalasafns. Skipulag fyrirhugaðs sniðs (dæmi hello.com umsókn):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(skipun -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" hætta 1 REAL MODE… ÁLF SEGMENTS… OPENBSD ATH… MACHO HEADERS… KÓÐI OG GÖGN… ZIP DIRECTORY…

Í upphafi skráarinnar er merkingin „MZqFpD“ tilgreind, sem er litið á sem haus fyrir Windows PE snið. Þessi röð er einnig afkóðuð í leiðbeiningunum „pop %r10; jno 0x4a ; jo 0x4a", og línan "\177ELF" til leiðbeiningarinnar "jg 0x47", sem eru notaðar til að framsenda að inngangsstaðnum. Unix kerfi keyra skeljakóða sem notar exec skipunina og sendir keyrslukóðann í gegnum ónefnda pípu. Takmörkun á fyrirhugaðri aðferð er hæfileikinn til að keyra á Unix-líkum stýrikerfum aðeins með því að nota skeljar sem styðja Thompson Shell samhæfingarham.

qemu-x86_64 símtalið veitir frekari færanleika og gerir kóða sem er settur saman fyrir x86_64 arkitektúrinn til að keyra á kerfum sem ekki eru x86, eins og Raspberry Pi töflur og Apple tæki búin ARM örgjörvum. Verkefnið er einnig hægt að nota til að búa til sjálfstætt forrit sem keyra án stýrikerfis (bare metal). Í slíkum forritum er ræsiforrit festur við keyrsluskrána og forritið virkar sem ræsanlegt stýrikerfi.

Staðlaða C bókasafnið libc þróað af verkefninu býður upp á 2024 aðgerðir (í fyrstu útgáfunni voru um 1400 aðgerðir). Hvað varðar frammistöðu virkar Cosmopolitan jafn hratt og glibc og er áberandi á undan Musl og Newlib, þrátt fyrir að Cosmopolitan sé stærðargráðu minni í kóðastærð en glibc og samsvarar um það bil Musl og Newlib. Til að fínstilla oft kallaðar aðgerðir eins og memcpy og strlen, er „trickle-down performance“ tæknin notuð til viðbótar, þar sem makróbinding er notuð til að kalla aðgerðina, þar sem þýðandinn er upplýstur um örgjörvaskrárnar sem taka þátt í keyrslu kóðans ferli, sem gerir kleift að vista tilföng þegar vistun CPU ástands með því að vista aðeins breytanlegar skrár.

Meðal breytinga í nýju útgáfunni:

  • Skipulaginu fyrir aðgang að innri tilföngum inni í zip-skrá hefur verið breytt (við opnun skráa eru venjulega /zip/... slóðir notaðar í stað þess að nota zip:.. forskeytið). Á sama hátt, til að fá aðgang að diskum í Windows, er hægt að nota slóðir eins og „/c/...“ í stað „C:/...“.
  • Nýtt APE (Actually Portable Executable) hleðslutæki hefur verið lagt til, sem skilgreinir snið alhliða keyranlegra skráa. Nýi hleðslutækið notar mmap til að setja forritið í minnið og breytir ekki lengur innihaldinu á flugi. Ef nauðsyn krefur er hægt að breyta alhliða keyrsluskránni í venjulegar keyrsluskrár tengdar einstökum kerfum.
  • Á Linux pallinum er hægt að nota binfmt_misc kjarnaeininguna til að keyra APE forrit. Það er tekið fram að notkun binfmt_misc er fljótlegasta ræsingaraðferðin.
  • Fyrir Linux hefur verið lagt til útfærslu á virkni pledge() og unveil() kerfiskallanna sem þróuð eru af OpenBSD verkefninu. API er til staðar til að nota þessi símtöl í forritum í C, C++, Python og Redbean, sem og pledge.com tól til að einangra handahófskennda ferla.
  • Byggingin notar Landlock Make tólið - útgáfu af GNU Make með strangari athugun á ósjálfstæði og notkun Landlock kerfiskallsins til að einangra forritið frá restinni af kerfinu og bæta skilvirkni skyndiminni. Sem valkostur er getu til að byggja með venjulegum GNU Make haldið.
  • Aðgerðir fyrir multithreading hafa verið innleiddar - _spawn() og _join(), sem eru alhliða bindingar yfir API sem eru sértæk fyrir mismunandi stýrikerfi. Einnig er unnið að því að innleiða POSIX Threads stuðning.
  • Það er hægt að nota _Thread_local lykilorðið til að nota aðskilda geymslu fyrir hvern þráð (TLS, Thread-Local Storage). Sjálfgefið er að C keyrslutími frumstillir TLS fyrir aðalþráðinn, sem hefur valdið því að lágmarks keyranleg stærð hefur aukist úr 12 KB í 16 KB.
  • Stuðningur við „--ftrace“ og „--strace“ færibreyturnar hefur verið bætt við keyrsluskrár til að gefa út upplýsingar um öll aðgerðarköll og kerfissímtöl til stderr.
  • Bætti við stuðningi fyrir closefrom() kerfiskallið, stutt á Linux 5.9+, FreeBSD 8+ og OpenBSD.
  • Á Linux pallinum hefur afköst clock_gettime og gettimeofday símtöl verið aukin allt að 10 sinnum með því að nota vDSO (virtual dynamic shared object) vélbúnaðurinn, sem gerir það mögulegt að færa kerfissímtalsstjórann yfir á notendarýmið og forðast samhengisrofa.
  • Stærðfræðileg föll til að vinna með tvinntölur hafa verið fluttar úr Musl bókasafninu. Vinnu margra stærðfræðilegra aðgerða hefur verið hraðað.
  • Nointernet() aðgerðin hefur verið lögð til til að slökkva á netgetu.
  • Bætt við nýjum aðgerðum til að bæta við strengjum á skilvirkan hátt: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf og vappendf.
  • Bætti við verndaðri útgáfu af kprintf() aðgerðafjölskyldunni, hönnuð til að vinna með aukin réttindi.
  • Verulega bætt frammistaða SSL, SHA, curve25519 og RSA útfærslur.

Heimild: opennet.ru

Bæta við athugasemd