Liberigo de la norma C-biblioteko Cosmopolitan 2.0, evoluigita por porteblaj ruleblaj dosieroj

La liberigo de la Cosmopolitan 2.0 projekto estis publikigita, evoluigante la norman C-bibliotekon kaj universalan ruleblan dosierformaton kiu povas esti uzita por distribui programojn por malsamaj operaciumoj sen la uzo de interpretistoj kaj virtualaj maŝinoj. La rezulto akirita per kompilado en GCC kaj Clang estas kompilita en statike ligitan universalan ruleblan dosieron, kiu povas esti rulita en iu ajn Linukso-distribuo, macOS, Vindozo, FreeBSD, OpenBSD, NetBSD, kaj eĉ vokita de la BIOS. La projektkodo estas distribuita sub la ISC-licenco (simpligita versio de MIT/BSD).

La ujo por generi universalajn ruleblajn dosierojn baziĝas sur kombinado de segmentoj kaj titoloj specifaj por malsamaj operaciumoj (PE, ELF, MACHO, OPENBSD) en unu dosiero, kombinante plurajn malsamajn formatojn uzatajn en Unikso, Vindozo kaj macOS. Por certigi, ke unuopa rulebla dosiero funkcias en Vindozo kaj Unikso-similaj sistemoj, lertaĵo estas kodi Windows PE-dosierojn kiel ŝelajn skriptojn, profitante la fakton, ke Thompson Shell ne uzas la "#!" manuskripto-markilon. Por krei programojn, kiuj inkluzivas plurajn dosierojn (ligante ĉiujn rimedojn en unu dosieron), ĝi subtenas la formadon de plenumebla dosiero en la formo de speciale desegnita ZIP-arkivo. Skemo de la proponita formato (ekzemplo hello.com aplikaĵo):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(komando -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" eliro 1 REALA MODO... ELF-SEGMENTOJ... OPENBSD NOTO... MAĈO-ĈAPITOJ... KODO KAJ DATUMO... ZIP DOSIERO...

Komence de la dosiero, la etikedo "MZqFpD" estas indikita, kiu estas perceptita kiel Windows PE-forma kaplinio. Ĉi tiu sekvenco ankaŭ estas malkodita en la instrukcio “pop %r10; jno 0x4a ; jo 0x4a", kaj la linio "\177ELF" al la instrukcio "jg 0x47", kiuj estas uzataj por plusendi al la enirpunkto. Unikso-similaj sistemoj funkcias ŝelkodon, kiu uzas la exec-komandon, pasigante la plenumeblan kodon tra nenomita tubo. Limigo de la proponita metodo estas la kapablo funkcii per Unikso-similaj operaciumoj nur uzante ŝelojn kiuj subtenas Thompson Shell-kongruecreĝimon.

La qemu-x86_64-voko disponigas plian porteblon kaj permesas al kodo kompilita por la x86_64-arkitekturo funkcii sur ne-x86-platformoj, kiel ekzemple Raspberry Pi-tabuloj kaj Apple-aparatoj ekipitaj per ARM-procesoroj. La projekto ankaŭ povas esti uzata por krei memstarajn aplikaĵojn, kiuj funkcias sen operaciumo (nuda metalo). En tiaj aplikoj, ekŝargilo estas alfiksita al la rulebla dosiero, kaj la programo funkcias kiel ekfunkciigebla operaciumo.

La norma C-biblioteko libc evoluigita de la projekto ofertas 2024 funkciojn (en la unua eldono estis ĉirkaŭ 1400 funkcioj). Laŭ efikeco, Cosmopolitan funkcias same rapide kiel glibc kaj estas videble antaŭ Musl kaj Newlib, malgraŭ la fakto ke Cosmopolitan estas grandordo pli malgranda en kodgrandeco ol glibc kaj proksimume egalrilatas al Musl kaj Newlib. Por optimumigi ofte nomitajn funkciojn kiel memcpy kaj strlen, la "trick-down performance" tekniko estas aldone uzata, en kiu makro-ligado estas uzata por voki la funkcion, en kiu la kompililo estas informita pri la CPU-registroj implikitaj en la kodekzekuto. procezo, kiu permesas ŝpari resursojn dum ŝparado de CPU-ŝtato ŝparante nur ŝanĝeblajn registrojn.

Inter la ŝanĝoj en la nova eldono:

  • La skemo por aliri internajn rimedojn ene de zip-dosiero estis ŝanĝita (ekzestante la dosieroj, la kutimaj /zip/... vojoj nun estas uzataj anstataŭ uzi la zip:.. prefikso). Simile, por aliri diskojn en Vindozo, eblas uzi vojojn kiel "/c/..." anstataŭ "C:/...".
  • Nova ŝarĝilo APE (Actually Portable Executable) estis proponita, kiu difinas la formaton de universalaj ruleblaj dosieroj. La nova ŝargilo uzas mmap por meti la programon en memoron kaj ne plu ŝanĝas la enhavon sur la flugo. Se necese, la universala rulebla dosiero povas esti konvertita en regulajn ruleblajn dosierojn ligitajn al individuaj platformoj.
  • Sur la Linukso-platformo, eblas uzi la binfmt_misc-kernan modulon por ruli APE-programojn. Oni rimarkas, ke uzi binfmt_misc estas la plej rapida lanĉa metodo.
  • Por Linukso, efektivigo de la funkcieco de la pledge() kaj unveil() sistemvokoj evoluigitaj per la OpenBSD-projekto estis proponita. API estas provizita por uzi ĉi tiujn vokojn en programoj en C, C++, Python kaj Redbean, same kiel pledge.com-ilaĵo por izoli arbitrajn procezojn.
  • La konstruo uzas la Landlock Make ilo - eldono de GNU Make kun pli strikta dependeckontrolado kaj la uzo de la Landlock sistemvoko por izoli la programon de la resto de la sistemo kaj plibonigi kaŝmemoro efikecon. Kiel opcio, la kapablo konstrui kun regula GNU Make estas konservita.
  • Funkcioj por multifadenado estis efektivigitaj - _spawn() kaj _join(), kiuj estas universalaj ligoj super APIoj specifaj por malsamaj operaciumoj. Ankaŭ funkcias por efektivigi subtenon de POSIX Threads.
  • Eblas uzi la ŝlosilvorton _Thread_local por uzi apartan stokadon por ĉiu fadeno (TLS, Thread-Local Storage). Defaŭlte, la rultempo C pravalorigas TLS por la ĉefa fadeno, kiu kaŭzis la minimuman plenumeblan grandecon pliiĝi de 12 KB al 16 KB.
  • Subteno por la parametroj "--ftrace" kaj "--strace" estis aldonita al ruleblaj dosieroj por eligi informojn pri ĉiuj funkciovokoj kaj sistemvokoj al stderr.
  • Aldonita subteno por la sistemvoko closefrom(), subtenata en Linukso 5.9+, FreeBSD 8+ kaj OpenBSD.
  • Sur la Linukso-platformo, la rendimento de clock_gettime kaj gettimeofday-vokoj estis pliigita ĝis 10 fojojn per uzado de la mekanismo vDSO (virtuala dinamika komuna objekto), kiu ebligas movi la sistemvokan prizorganton al uzantspaco kaj eviti kuntekstŝanĝojn.
  • Matematikaj funkcioj por labori kun kompleksaj nombroj estis movitaj de la Musl-biblioteko. La laboro de multaj matematikaj funkcioj akceliĝis.
  • La funkcio nointernet() estis proponita por malŝalti retkapablojn.
  • Aldonitaj novaj funkcioj por efike almeti ŝnurojn: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf kaj vappendf.
  • Aldonis protektitan version de la familio de funkcioj kprintf(), desegnita por funkcii kun altigitaj privilegioj.
  • Signife plibonigita efikeco de SSL, SHA, kurbo25519 kaj RSA-efektivigoj.

fonto: opennet.ru

Aldoni komenton