Standarta C bibliotēkas Cosmopolitan 2.0 izlaidums, kas izstrādāts pārnēsājamiem izpildāmiem failiem

Publicēts Cosmopolitan 2.0 projekta izlaidums, kas izstrādā standarta C bibliotēku un universālu izpildāmā faila formātu, ko var izmantot programmu izplatÄ«Å”anai dažādām operētājsistēmām, neizmantojot tulkus un virtuālās maŔīnas. Rezultāts, kas iegÅ«ts, kompilējot GCC un Clang, tiek apkopots statiski saistÄ«tā universālā izpildāmā failā, kuru var palaist jebkurā Linux distribÅ«cijā, macOS, Windows, FreeBSD, OpenBSD, NetBSD un pat izsaukt no BIOS. Projekta kods tiek izplatÄ«ts saskaņā ar ISC licenci (MIT/BSD vienkārÅ”ota versija).

Universālu izpildāmo failu Ä£enerÄ“Å”anas konteiners ir balstÄ«ts uz dažādām operētājsistēmām (PE, ELF, MACHO, OPENBSD) raksturÄ«gu segmentu un galveņu apvienoÅ”anu vienā failā, apvienojot vairākus dažādus formātus, ko izmanto Unix, Windows un macOS. Lai nodroÅ”inātu, ka Windows un Unix sistēmās darbojas viens izpildāmais fails, Windows PE faili tiek kodēti kā čaulas skripti, izmantojot to, ka Thompson Shell neizmanto skripta marÄ·ieri ā€œ#!ā€. Lai izveidotu programmas, kas ietver vairākus failus (saistot visus resursus vienā failā), tas atbalsta izpildāmā faila veidoÅ”anu Ä«paÅ”i izveidota ZIP arhÄ«va veidā. Piedāvātā formāta shēma (piemērs hello.com lietojumprogrammai):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(komanda -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" iziet no 1 REĀLĀ REŽÄŖMAā€¦ ELF SEGMENTIā€¦ OPENBSD PIEZÄŖMEā€¦ MACHO GALVESā€¦ KODS UN DATIā€¦ ZIP KATALOGSā€¦

Faila sākumā ir norādÄ«ta etiÄ·ete ā€œMZqFpDā€, kas tiek uztverta kā Windows PE formāta galvene. Å Ä« secÄ«ba ir atÅ”ifrēta arÄ« instrukcijā ā€œpop %r10; jno 0x4a; jo 0x4a" un rindu "\177ELF" uz instrukciju "jg 0x47", ko izmanto, lai pārsÅ«tÄ«tu uz ieejas punktu. Unix sistēmas palaiž čaulas kodu, kas izmanto komandu exec, nododot izpildāmo kodu caur nenosauktu cauruli. Piedāvātās metodes ierobežojums ir iespēja darboties Unix lÄ«dzÄ«gās operētājsistēmās, tikai izmantojot apvalkus, kas atbalsta Thompson Shell saderÄ«bas režīmu.

Izsaukums qemu-x86_64 nodroÅ”ina papildu pārnesamÄ«bu un ļauj kodam, kas kompilēts x86_64 arhitektÅ«rai, darboties platformās, kas nav x86, piemēram, Raspberry Pi plates un Apple ierÄ«ces, kas aprÄ«kotas ar ARM procesoriem. Projektu var izmantot arÄ«, lai izveidotu autonomas lietojumprogrammas, kas darbojas bez operētājsistēmas (bez metāla). Šādās lietojumprogrammās izpildāmajam failam ir pievienots sāknÄ“Å”anas ielādētājs, un programma darbojas kā sāknējama operētājsistēma.

Projekta izstrādātā standarta C bibliotēka libc piedāvā 2024 funkcijas (pirmajā laidienā bija aptuveni 1400 funkciju). Veiktspējas ziņā Cosmopolitan darbojas tikpat ātri kā glibc un ievērojami apsteidz Musl un Newlib, neskatoties uz to, ka Cosmopolitan ir par kārtu mazāks koda lielums nekā glibc un aptuveni atbilst Musl un Newlib. Lai optimizētu bieži izsauktās funkcijas, piemēram, memcpy un strlen, papildus tiek izmantota ā€œtrikle-down performanceā€ tehnika, kurā funkcijas izsaukÅ”anai tiek izmantots makro saistÄ«jums, kurā kompilators tiek informēts par koda izpildē iesaistÄ«tajiem CPU reÄ£istriem. process, kas ļauj ietaupÄ«t resursus, saglabājot CPU stāvokli, saglabājot tikai maināmos reÄ£istrus.

Starp izmaiņām jaunajā laidienā:

  • Ir mainÄ«ta shēma piekļuvei iekŔējiem resursiem zip failā (atverot failus, tagad tiek izmantoti parastie /zip/... ceļi, nevis tiek lietots zip:.. prefikss). Tāpat, lai piekļūtu diskiem sistēmā Windows, ir iespējams izmantot tādus ceļus kā ā€œ/c/...ā€, nevis ā€œC:/...ā€.
  • Ir ierosināts jauns APE (Actually Portable Executable) ielādētājs, kas nosaka universālo izpildāmo failu formātu. Jaunais ielādētājs izmanto mmap, lai ievietotu programmu atmiņā un vairs nemaina saturu lidojuma laikā. Ja nepiecieÅ”ams, universālo izpildāmo failu var pārvērst parastos izpildāmos failos, kas saistÄ«ti ar atseviŔķām platformām.
  • Linux platformā ir iespējams izmantot kodola moduli binfmt_misc, lai palaistu APE programmas. JāatzÄ«mē, ka binfmt_misc izmantoÅ”ana ir ātrākā palaiÅ”anas metode.
  • Linux ir piedāvāta OpenBSD projekta izstrādāto sistēmas izsaukumu pledge() un unveil() funkcionalitātes ievieÅ”ana. Å o zvanu izmantoÅ”anai programmās C, C++, Python un Redbean ir nodroÅ”ināta API, kā arÄ« pledge.com utilÄ«ta patvaļīgu procesu izolÄ“Å”anai.
  • BÅ«vÄ“Å”anai tiek izmantota utilÄ«ta Landlock Make ā€” ā€‹ā€‹GNU Make izdevums ar stingrāku atkarÄ«bas pārbaudi un Landlock sistēmas izsaukuma izmantoÅ”anu, lai izolētu programmu no pārējās sistēmas un uzlabotu keÅ”atmiņas efektivitāti. Kā opcija tiek saglabāta iespēja veidot ar parasto GNU Make.
  • Ir ieviestas daudzpavedienu funkcijas - _spawn() un _join(), kas ir universālas saistÄ«Å”anas ar API, kas raksturÄ«gas dažādām operētājsistēmām. Notiek arÄ« darbs pie POSIX Threads atbalsta ievieÅ”anas.
  • Ir iespējams izmantot atslēgvārdu _Thread_local, lai katram pavedienam izmantotu atseviŔķu krātuvi (TLS, Thread-Local Storage). Pēc noklusējuma C izpildlaiks inicializē TLS galvenajam pavedienam, kā rezultātā minimālais izpildāmā faila lielums ir palielinājies no 12 KB lÄ«dz 16 KB.
  • Atbalsts parametriem ā€œ--ftraceā€ un ā€œ--straceā€ ir pievienots izpildāmajiem failiem, lai izvadÄ«tu informāciju par visiem funkciju izsaukumiem un sistēmas izsaukumiem uz stderr.
  • Pievienots atbalsts closefrom() sistēmas izsaukumam, atbalstÄ«ts operētājsistēmās Linux 5.9+, FreeBSD 8+ un OpenBSD.
  • Linux platformā clock_gettime un gettimeofday zvanu veiktspēja ir palielināta lÄ«dz pat 10 reizēm, izmantojot vDSO (virtual dynamic shared object) mehānismu, kas ļauj pārvietot sistēmas zvanu apstrādātāju uz lietotāja telpu un izvairÄ«ties no konteksta pārslēgÅ”anas.
  • Matemātiskās funkcijas darbam ar kompleksajiem skaitļiem ir pārvietotas no Musl bibliotēkas. Daudzu matemātisko funkciju darbÄ«ba ir paātrināta.
  • Funkcija nointernet() ir piedāvāta, lai atspējotu tÄ«kla iespējas.
  • Pievienotas jaunas funkcijas efektÄ«vai virkņu pievienoÅ”anai: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf un vappendf.
  • Pievienota aizsargāta kprintf() funkciju saimes versija, kas paredzēta darbam ar paaugstinātām privilēģijām.
  • Ievērojami uzlabota SSL, SHA, curve25519 un RSA implementāciju veiktspēja.

Avots: opennet.ru

Pievieno komentāru