Cosmopolitan 2.0 C liburutegi estandarraren kaleratzea, fitxategi exekutagarri eramangarrietarako garatua

Cosmopolitan 2.0 proiektuaren oharra argitaratu da, C liburutegi estandarra eta fitxategi exekutagarri unibertsala garatuz, sistema eragile ezberdinetarako programak interpretatzailerik eta makina birtualak erabili gabe banatzeko erabil daitekeena. GCC eta Clang-en konpilatuz lortutako emaitza estatikoki estekatuta dagoen fitxategi exekutagarri unibertsal batean biltzen da, edozein Linux banaketatan exekutatu daitekeena, macOS, Windows, FreeBSD, OpenBSD, NetBSD, eta baita BIOSetik deitu ere. Proiektuaren kodea ISC lizentziapean banatzen da (MIT/BSDren bertsio sinplifikatua).

Fitxategi exekutagarri unibertsalak sortzeko edukiontzia sistema eragile ezberdinen (PE, ELF, MACHO, OPENBSD) espezifikoak diren segmentuak eta goiburuak fitxategi batean konbinatzean oinarritzen da, Unix, Windows eta macOS-en erabiltzen diren hainbat formatu konbinatuz. Fitxategi exekutagarri bakarra Windows eta Unix sistemetan exekutatzen dela ziurtatzeko, trikimailu bat da Windows PE fitxategiak shell script gisa kodetzea, Thompson Shell-ek "#!" script-markatzailea ez duela erabiltzen aprobetxatuz. Fitxategi batzuk barne hartzen dituzten programak sortzeko (baliabide guztiak fitxategi batean lotuz), fitxategi exekutagarri bat sortzea onartzen du, bereziki diseinatutako ZIP artxibo baten moduan. Proposatutako formatuaren eskema (adibidea hello.com aplikazioa):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(komandoa -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" irten 1 MODU ERREAL… ELF SEGMENTOAK… OPENBSD OHARRA… MACHIKO GOIBURUAK… KODEA ETA DATUAK… ZIP DIRECTORY…

Fitxategiaren hasieran, "MZqFpD" etiketa adierazten da, Windows PE formatuko goiburu gisa hautematen dena. Sekuentzia hau “pop %r10; jno 0x4a ; jo 0x4a", eta "\177ELF" lerroa "jg 0x47" instrukzioari, sarrera-puntura birbidaltzeko erabiltzen direnak. Unix sistemek exec komandoa erabiltzen duen shell kodea exekutatzen dute, eta kode exekutagarria izenik gabeko kanalizazio batetik pasatzen dute. Proposatutako metodoaren muga Unix antzeko sistema eragileetan Thompson Shell bateragarritasun modua onartzen duten shell-ak soilik erabiliz exekutatzeko gaitasuna da.

qemu-x86_64 deiak eramangarritasun gehigarria eskaintzen du eta x86_64 arkitekturarako konpilatutako kodea x86 ez diren plataformetan exekutatzeko aukera ematen du, hala nola Raspberry Pi plaketan eta ARM prozesadoreekin hornitutako Apple gailuetan. Proiektua sistema eragilerik gabe (barre metal) exekutatzen diren aplikazio autonomoak sortzeko ere erabil daiteke. Horrelako aplikazioetan, fitxategi exekutagarriari abio-kargatzailea eransten zaio eta programak sistema eragile abiarazteko moduan jokatzen du.

Proiektuak garatutako C liburutegiko libc estandarrak 2024 funtzio eskaintzen ditu (lehen bertsioan 1400 funtzio inguru zeuden). Errendimenduari dagokionez, Cosmopolitan-ek glibc bezain azkar funtzionatzen du eta Musl eta Newlib-en aurretik nabari da, Cosmopolitan-ek glibc baino kode-tamaina txikiagoa den eta gutxi gorabehera Musl eta Newlib-i dagokie arren. Memcpy eta strlen bezalako maiz deitzen diren funtzioak optimizatzeko, "trickle-down performance" teknika ere erabiltzen da, zeinean makro lotura bat erabiltzen den funtzioa deitzeko, non konpilatzaileari kodearen exekuzioan parte hartzen duten CPU erregistroen berri ematen zaion. prozesua, zeinak PUZaren egoera gordetzean baliabideak aurreztea ahalbidetzen duena, erregistro aldagarriak soilik gordez.

Argitalpen berriaren aldaketen artean:

  • Zip fitxategi baten barneko baliabideak sartzeko eskema aldatu da (fitxategiak irekitzean, /zip/... bideak erabiltzen dira orain zip:.. aurrizkia erabili beharrean). Era berean, Windows-en diskoetara sartzeko, "/c/..." bezalako bideak erabil daitezke "C:/..."ren ordez.
  • APE (Actually Portable Executable) kargatzaile berri bat proposatu da, fitxategi exekutagarri unibertsalen formatua definitzen duena. Kargatzaile berriak mmap erabiltzen du programa memorian jartzeko eta jada ez du edukia berehala aldatzen. Beharrezkoa izanez gero, fitxategi exekutagarri unibertsala banakako plataformetara lotuta dauden fitxategi exekutagarri arruntetan bihur daiteke.
  • Linux plataforman, binfmt_misc kernel modulua erabil daiteke APE programak exekutatzeko. Kontuan izan da binfmt_misc erabiltzea abiarazteko metodorik azkarrena dela.
  • Linux-erako, OpenBSD proiektuak garatutako pledge() eta unveil() sistema-deien funtzionaltasunaren ezarpena proposatu da. Dei hauek C, C++, Python eta Redbean programetan erabiltzeko API bat eskaintzen da, baita prozesu arbitrarioak isolatzeko pledge.com erabilgarritasun bat ere.
  • Eraikuntzak Landlock Make utilitatea erabiltzen du - GNU Makeren edizioa menpekotasun-egiaztapen zorrotzagoa duena eta Landlock sistema-deia erabiltzen duena, programa gainerako sistematik isolatzeko eta cachearen eraginkortasuna hobetzeko. Aukera gisa, GNU Make arruntarekin eraikitzeko gaitasuna mantentzen da.
  • Multithreading-erako funtzioak inplementatu dira - _spawn() eta _join(), sistema eragile desberdinetarako berariazko APIen gaineko lotura unibertsalak direnak. POSIX Threads euskarria ezartzeko ere lanean ari dira.
  • _Thread_local gako-hitza erabil daiteke hari bakoitzeko biltegiratze bereizia erabiltzeko (TLS, Thread-Local Storage). Lehenespenez, C exekuzio-denborak TLS hasieratzen du hari nagusirako, eta horrek eragin du exekutagarriaren gutxieneko tamaina 12 KBtik 16 KBra igotzea.
  • “--ftrace” eta “--strace” parametroetarako laguntza gehitu da fitxategi exekutagarrietan funtzio-dei guztiei eta sistema-deiei buruzko informazioa stderr-era ateratzeko.
  • Closefrom() sistema-deirako laguntza gehitu da, Linux 5.9+, FreeBSD 8+ eta OpenBSD-ekin bateragarria.
  • Linux plataforman, clock_gettime eta gettimeofday deien errendimendua 10 aldiz handitu da vDSO (birtual dynamic dynamic shared object) mekanismoa erabiliz, sistemaren deien kudeatzailea erabiltzaileen espaziora eramatea eta testuinguru-aldaketak saihesteko aukera ematen duena.
  • Zenbaki konplexuekin lan egiteko funtzio matematikoak mugitu dira Musl liburutegitik. Funtzio matematiko askoren lana bizkortu egin da.
  • nointernet() funtzioa sareko gaitasunak desgaitzeko proposatu da.
  • Funtzio berriak gehitu dira kateak modu eraginkorrean eransteko: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf eta vappendf.
  • Kprintf() funtzio-familiaren bertsio babestua gehitu da, pribilegio handiekin lan egiteko diseinatua.
  • SSL, SHA, curve25519 eta RSA inplementazioen errendimendua nabarmen hobetu da.

Iturria: opennet.ru

Gehitu iruzkin berria