Ukukhishwa kwelabhulali ye-C evamile i-Cosmopolitan 2.0, eyenzelwe amafayela aphathekayo asebenzisekayo

Ukukhishwa kwephrojekthi ye-Cosmopolitan 2.0 kushicilelwe, kuthuthukiswa umtapo wezincwadi ojwayelekile we-C kanye nefomethi yendawo yonke yefayela elisebenzisekayo elingasetshenziswa ukusabalalisa izinhlelo zezinhlelo zokusebenza ezihlukene ngaphandle kokusebenzisa otolika nemishini ebonakalayo. Umphumela otholwe ngokuhlanganisa ku-GCC naku-Clang uhlanganiswa ube ifayela elisebenzisekayo elisebenza emhlabeni wonke elixhunywe ngokwezibalo elingasetshenziswa kunoma yikuphi ukusatshalaliswa kwe-Linux, i-macOS, i-Windows, i-FreeBSD, i-OpenBSD, i-NetBSD, futhi ibizwa ngisho ne-BIOS. Ikhodi yephrojekthi isatshalaliswa ngaphansi kwelayisensi ye-ISC (inguqulo eyenziwe lula ye-MIT/BSD).

Isiqukathi sokukhiqiza amafayela asebenzisekayo jikelele sisekelwe ekuhlanganiseni izingxenye nezihloko eziqondene nezinhlelo zokusebenza ezihlukene (PE, ELF, MACHO, OPENBSD) efayeleni elilodwa, kuhlanganiswe amafomethi amaningana ahlukene asetshenziswa ku-Unix, Windows kanye ne-macOS. Ukuqinisekisa ukuthi ifayela elilodwa elisebenzisekayo lisebenza ezinhlelweni ze-Windows ne-Unix, iqhinga ukuhlanganisa amafayela e-Windows PE njengemibhalo yegobolondo, usebenzisa leli thuba lokuthi u-Thompson Shell akasebenzisi umaka wombhalo othi "#!". Ukwakha izinhlelo ezihlanganisa amafayela amaningana (okuxhumanisa zonke izinsiza efayeleni elilodwa), isekela ukwakheka kwefayela elisebenzisekayo ngendlela yengobo yomlando ye-ZIP eklanywe ngokukhethekile. Isikimu sefomethi ehlongozwayo (isibonelo isicelo se-hello.com):

MZqFpD='BIOS BOOT SECTOR' yenza 7 $(command -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" phuma 1 INDLELA YANGEMPELA… AMASEGMENTI E-ELF… OPENBSD QAPHELA… IZIHLOKO ZAMA-MCHO… IKHODI KANYE NEDATHA… UHLELO LWEZIZIP…

Ekuqaleni kwefayela, ilebula ethi “MZqFpD” ikhonjisiwe, ebonwa njengenhlokweni yefomethi yeWindows PE. Lokhu kulandelana kuphinde kuqoshwe emyalezweni othi “pop %r10; nxa 0x4a; jo 0x4a", kanye nomugqa "\177ELF" oya kumyalelo othi "jg 0x47", osetshenziselwa ukudlulisela phambili endaweni yokungena. Amasistimu e-Unix asebenzisa ikhodi yegobolondo esebenzisa umyalo we-exec, edlulisa ikhodi esebenzisekayo ngepayipi elingashiwongo. Umkhawulo wendlela ehlongozwayo yikhono lokusebenza kumasistimu wokusebenza afana ne-Unix kuphela usebenzisa amagobolondo asekela imodi yokuhambisana ye-Thompson Shell.

Ucingo lwe-qemu-x86_64 lunikeza ukuphatheka okwengeziwe futhi luvumela ikhodi ehlanganisiwe yokwakheka kwe-x86_64 ukuthi isebenze kuzingxenyekazi ezingezona ze-x86, ezifana namabhodi we-Raspberry Pi namadivayisi we-Apple ahlonyiswe ngama-ARM processors. Le phrojekthi ingase isetshenziselwe ukudala izinhlelo zokusebenza ezizimele ezisebenza ngaphandle kwesistimu yokusebenza (insimbi engenalutho). Kulezo zinhlelo zokusebenza, i-bootloader inamathiselwe efayeleni elisebenzisekayo, futhi uhlelo lusebenza njengohlelo olusebenzayo olusebenzayo.

I-libc yelabhulali evamile ye-C eyakhiwe iphrojekthi inikeza imisebenzi engu-2024 (ekukhishweni kokuqala bekunemisebenzi engaba ngu-1400). Mayelana nokusebenza, i-Cosmopolitan isebenza ngokushesha njenge-glibc futhi ihamba phambili ngokuphawulekayo kune-Musl ne-Newlib, naphezu kweqiniso lokuthi i-Cosmopolitan iwuhlelo lobukhulu obuncane ngosayizi wekhodi kune-glibc futhi icishe ifane ne-Musl ne-Newlib. Ukuze kuthuthukiswe imisebenzi evame ukubizwa ngokuthi i-memcpy ne-strlen, indlela "yokusebenza kokudonsa phansi" iyasetshenziswa futhi, lapho isibopho esikhulu sisetshenziselwa ukubiza umsebenzi, lapho umhlanganisi aziswa khona mayelana namarejista e-CPU abandakanyekayo ekwenziweni kwekhodi. inqubo, evumela ukonga izinsiza lapho usindisa isimo se-CPU ngokulondoloza amarejista ashintshekayo kuphela.

Phakathi kwezinguquko ekukhishweni okusha:

  • Uhlelo lokufinyelela izinsiza zangaphakathi ngaphakathi kwefayela le-zip lushintshiwe (uma uvula amafayela, izindlela ezijwayelekile /zip/... manje sezisetshenziswa esikhundleni sokusebenzisa i-zip:.. isiqalo). Ngokufanayo, ukuze ufinyelele amadiski ku-Windows, kungenzeka ukusebenzisa izindlela ezinjengokuthi “/c/...” esikhundleni sokuthi “C:/...”.
  • Isilayishi esisha se-APE (Esiphathekayo Esisebenzisekayo) sihlongoziwe, esichaza ifomethi yamafayela asebenzisekayo jikelele. Isilayishi esisha sisebenzisa i-mmap ukubeka uhlelo enkumbulweni futhi ayisakushintshi okuqukethwe ngokuhamba kwesikhathi. Uma kunesidingo, ifayela elisebenzisekayo jikelele lingaguqulelwa kumafayela asebenzisekayo avamile aboshelwe ezinkundleni ngazinye.
  • Kuplathifomu ye-Linux, kungenzeka ukusebenzisa imojuli ye-binfmt_misc kernel ukuze usebenzise izinhlelo ze-APE. Kuyaphawulwa ukuthi ukusebenzisa i-binfmt_misc kuyindlela yokuqalisa eshesha kakhulu.
  • Ku-Linux, ukuqaliswa kokusebenza kwezingcingo ze-pledge() kanye ne-unveil() ezithuthukiswe iphrojekthi ye-OpenBSD kuhlongoziwe. I-API ihlinzekelwe ukusebenzisa lezi zingcingo ezinhlelweni eziku-C, C++, Python kanye ne-Redbean, kanye nensiza ye-pledge.com yokuhlukanisa izinqubo ezingafuneki.
  • Isakhiwo sisebenzisa i-Landlock Make utility - uhlelo lwe-GNU Make olunokuhlola ukuncika okuqinile kanye nokusetshenziswa kwekholi yesistimu ye-Landlock ukuze kuhlukaniswe uhlelo kulo lonke uhlelo futhi kuthuthukiswe ukusebenza kahle kokugcinwa kwesikhashana. Njengenketho, ikhono lokwakha nge-GNU Make evamile liyagcinwa.
  • Imisebenzi ye-multithreading yenziwe - _spawn() kanye ne-_join(), okuyizibopho zomhlaba wonke phezu kwama-API aqondene nezinhlelo zokusebenza ezihlukene. Umsebenzi nawo uyaqhubeka wokusebenzisa ukwesekwa kwe-POSIX Threads.
  • Kungenzeka ukusebenzisa igama elingukhiye elithi _Thread_local ukuze usebenzise isitoreji esihlukene kuchungechunge ngalunye (i-TLS, Isitoreji Sendawo Yezintambo). Ngokuzenzakalelayo, isikhathi sokusebenza esingu-C siqalisa i-TLS kuchungechunge oluyinhloko, okubangele ukuthi usayizi omncane osebenzisekayo ukhuphuke usuka ku-12 ukuya ku-16 KB.
  • Ukusekelwa kwemingcele ye-“--ftrace” kanye ne-“--strace” yengezwe kumafayela asebenzisekayo ukuze kukhishwe ulwazi mayelana nawo wonke amakholi wemisebenzi namakholi wesistimu kuya ku-stderr.
  • Kungezwe usekelo lwekholi yesistimu ye-closefrom(), esekelwa ku-Linux 5.9+, FreeBSD 8+ ne-OpenBSD.
  • Kuplathifomu ye-Linux, ukusebenza kwezingcingo ze-clock_gettime kanye ne-gettimeofday kunyuswe izikhathi ezingafika kwezi-10 ngokusebenzisa indlela ye-vDSO (into eguqukayo ebonakalayo), eyenza kube nokwenzeka ukuhambisa isibambi sezingcingo sesistimu endaweni yomsebenzisi futhi kugwenywe ukushintsha kokuqukethwe.
  • Imisebenzi yezibalo yokusebenza ngezinombolo eziyinkimbinkimbi isusiwe kulabhulali ye-Musl. Umsebenzi wemisebenzi eminingi yezibalo ususheshisiwe.
  • Umsebenzi we-nointernet() uhlongozwa ukuze ukhubaze amandla enethiwekhi.
  • Kwengezwe imisebenzi emisha yeyunithi yezinhlamvu ezihlanganisa kahle: i-append, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf kanye ne-vappendf.
  • Kwengezwe inguqulo evikelwe yomndeni we-kprintf() wemisebenzi, edizayinelwe ukusebenza namalungelo aphakeme.
  • Ukusebenza okuthuthuke kakhulu kwe-SSL, SHA, curve25519 kanye nokuqaliswa kwe-RSA.

Source: opennet.ru

Engeza amazwana