Sakin daidaitaccen ɗakin karatu na C Cosmopolitan 2.0, wanda aka haɓaka don fayilolin aiwatarwa

An buga sakin aikin Cosmopolitan 2.0, yana haɓaka daidaitaccen ɗakin karatu na C da tsarin fayil mai aiwatarwa na duniya wanda za'a iya amfani dashi don rarraba shirye-shirye don tsarin aiki daban-daban ba tare da amfani da masu fassara da injina ba. Sakamakon da aka samu ta hanyar tattarawa a cikin GCC da Clang an haɗa shi cikin babban fayil ɗin da za a iya aiwatar da shi wanda za'a iya aiwatar da shi akan kowane rarraba Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD, har ma da kira daga BIOS. Ana rarraba lambar aikin a ƙarƙashin lasisin ISC (sauƙaƙin sigar MIT/BSD).

Akwatin don ƙirƙirar fayilolin aiwatarwa na duniya ya dogara ne akan haɗa sassan da kanun labarai na musamman ga tsarin aiki daban-daban (PE, ELF, MACHO, OPENBSD) a cikin fayil ɗaya, haɗa nau'ikan nau'ikan nau'ikan nau'ikan da aka yi amfani da su a cikin Unix, Windows da macOS. Don tabbatar da cewa fayil guda ɗaya mai aiwatarwa yana gudana akan tsarin Windows da Unix, dabara ita ce sanya fayilolin Windows PE azaman rubutun harsashi, yin amfani da gaskiyar cewa Thompson Shell baya amfani da alamar rubutun "#!". Don ƙirƙirar shirye-shirye waɗanda suka haɗa da fayiloli da yawa (haɗa duk albarkatu cikin fayil ɗaya), yana goyan bayan ƙirƙirar fayil ɗin aiwatarwa a cikin nau'in tsararrun tarihin ZIP na musamman. Tsarin tsarin da aka tsara (misali hello.com aikace-aikacen):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(umurni -v $0) printf ''\177ELF...LINKER-ENCODED-FREEBSD-HEADER'>&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" fita 1 GASKIYA MUNANAN… ELF SEGMENTS… BUDADDIYAR NOTE… MACHO HEADERS… CODE AND DATA…

A farkon fayil ɗin, ana nuna alamar “MZqFpD”, wanda ake ɗauka azaman taken tsarin Windows PE. Hakanan an yanke wannan jeri a cikin umarnin “pop%r10; jno 0x4a; jo 0x4a", da layin "\177ELF" zuwa umarni "jg 0x47", waɗanda ake amfani da su don turawa zuwa wurin shigarwa. Tsarin Unix yana gudanar da lambar harsashi wanda ke amfani da umarnin exec, yana wucewa da lambar da za a iya aiwatarwa ta bututun da ba a bayyana sunansa ba. Ƙayyadadden hanyar da aka tsara shine ikon yin aiki akan tsarin aiki kamar Unix kawai ta amfani da harsashi waɗanda ke goyan bayan yanayin dacewa na Thompson Shell.

Kiran qemu-x86_64 yana ba da ƙarin ɗawainiya kuma yana ba da damar lambar da aka haɗa don gine-ginen x86_64 don gudana akan dandamali marasa x86, kamar allon Rasberi Pi da na'urorin Apple sanye take da na'urori masu sarrafa ARM. Hakanan za'a iya amfani da aikin don ƙirƙirar aikace-aikacen sarrafa kansa waɗanda ke gudana ba tare da tsarin aiki ba (ƙarfe bare). A cikin irin waɗannan aikace-aikacen, ana haɗe bootloader zuwa fayil ɗin da za a iya aiwatarwa, kuma shirin yana aiki azaman tsarin aiki na bootable.

Daidaitaccen ɗakin karatu na C libc wanda aikin ya haɓaka yana ba da ayyuka 2024 (a cikin sakin farko akwai ayyuka kusan 1400). Dangane da aiki, Cosmopolitan yana aiki da sauri kamar glibc kuma yana gaban Musl da Newlib, duk da cewa Cosmopolitan tsari ne na girman girma a girman lambar fiye da glibc kuma kusan yayi daidai da Musl da Newlib. Don haɓaka ayyukan da ake kira akai-akai kamar memcpy da strlen, ana kuma amfani da dabarar “ƙara-ƙasa-ƙasa” dabarar, wacce ake amfani da ɗaure macro don kiran aikin, wanda aka sanar da mai tarawa game da rijistar CPU da ke cikin aiwatar da lambar. tsari, wanda ke ba da damar adana albarkatu lokacin adana jihar CPU ta hanyar adana rajistar masu canzawa kawai.

Daga cikin canje-canje a cikin sabon sakin:

  • An canza makirci don samun damar albarkatu na ciki a cikin fayil ɗin zip (lokacin buɗe fayiloli, ana amfani da hanyoyin /zip/... na yau da kullun maimakon amfani da zip: prefix). Hakazalika, don samun damar faifai a cikin Windows, yana yiwuwa a yi amfani da hanyoyi kamar "/c/..." maimakon "C:/...".
  • An gabatar da sabon mai ɗaukar kaya na APE (A gaskiya Portable Executable), wanda ke bayyana tsarin fayilolin aiwatarwa na duniya. Sabuwar loda tana amfani da mmap don sanya shirin a cikin ƙwaƙwalwar ajiya kuma baya canza abun ciki akan tashi. Idan ya cancanta, ana iya canza fayil ɗin aiwatarwa na duniya zuwa fayilolin aiwatarwa na yau da kullun waɗanda ke daure da dandamali ɗaya.
  • A kan dandalin Linux, yana yiwuwa a yi amfani da tsarin binfmt_misc kernel don gudanar da shirye-shiryen APE. An lura cewa yin amfani da binfmt_misc ita ce hanyar ƙaddamar da mafi sauri.
  • Don Linux, an gabatar da aiwatar da ayyukan alƙawarin () da buɗe () kiran tsarin da aikin OpenBSD ya haɓaka. An tanadar API don yin amfani da waɗannan kira a cikin shirye-shirye a cikin C, C++, Python da Redbean, da kuma mai amfani na jingina.com don keɓance matakai na sabani.
  • Ginin yana amfani da Landlock Make utility - bugu na GNU Make tare da ƙarin ƙwaƙƙwaran dogaro da kuma amfani da tsarin tsarin Landlock don ware shirin daga sauran tsarin da haɓaka ingantaccen caching. A matsayin zaɓi, ikon ginawa tare da GNU Make na yau da kullun ana kiyaye shi.
  • An aiwatar da ayyuka don multithreading - _spawn() da _join(), waɗanda ke daure na duniya akan APIs musamman ga tsarin aiki daban-daban. Ana kuma ci gaba da aiki don aiwatar da tallafin POSIX Threads.
  • Yana yiwuwa a yi amfani da _Thread_local keyword don amfani da keɓance ma'ajiyar kowane zaren (TLS, Thread-Local Storage). Ta hanyar tsoho, lokacin gudu na C yana fara TLS don babban zaren, wanda ya haifar da ƙaramar girman aiwatarwa daga 12 KB zuwa 16 KB.
  • An ƙara goyan bayan sigogi na "-ftrace" da "--strace" zuwa fayilolin aiwatarwa don fitar da bayanai game da duk kiran aiki da kiran tsarin zuwa stderr.
  • Ƙara goyon baya don kiran tsarin () na kusa, mai goyan bayan Linux 5.9+, FreeBSD 8+ da OpenBSD.
  • A kan dandamalin Linux, an ƙara yawan ayyukan clock_gettime da kiran rana zuwa sau 10 ta hanyar amfani da tsarin vDSO (Virtual dynamic shared thing), wanda ke ba da damar matsar da mai kula da tsarin zuwa sararin mai amfani da kuma guje wa sauya mahallin.
  • Ayyukan lissafi don aiki tare da lambobi masu rikitarwa an motsa su daga ɗakin karatu na Musl. An haɓaka ayyukan ayyukan lissafi da yawa.
  • An gabatar da aikin nointernet() don kashe damar cibiyar sadarwa.
  • Sabbin ayyuka da aka ƙara don ingantaccen haɗa igiyoyi: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf da vappendf.
  • An ƙara ƙaƙƙarfan sigar dangin ayyuka na kprintf(), ƙirƙira don aiki tare da manyan gata.
  • Ingantacciyar ingantattun ayyuka na SSL, SHA, curve25519 da aiwatar da RSA.

source: budenet.ru

Add a comment