Liberasyon estanda C bibliyotèk Cosmopolitan 2.0, devlope pou dosye pòtab ègzèkutabl

Yo te pibliye liberasyon pwojè Cosmopolitan 2.0, devlope bibliyotèk estanda C ak yon fòma inivèsèl ègzèkutabl ki ka itilize pou distribye pwogram pou diferan sistèm operasyon san yo pa itilize entèprèt ak machin vityèl. Rezilta yo jwenn nan konpile nan GCC ak Clang konpile nan yon fichye ègzèkutabl inivèsèl ki lye statikman ki ka kouri sou nenpòt distribisyon Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD, e menm rele nan BIOS la. Kòd pwojè a distribye anba lisans ISC (yon vèsyon senplifye MIT/BSD).

Kontenè pou jenere fichye ègzèkutabl inivèsèl baze sou konbine segman ak headers espesifik nan diferan sistèm opere (PE, ELF, MACHO, OPENBSD) nan yon sèl dosye, konbine plizyè fòma diferan yo itilize nan Unix, Windows ak macOS. Pou asire ke yon sèl dosye ègzèkutabl kouri sou Windows ak sistèm Unix, yon Trick se kode dosye Windows PE kòm scripts koki, pran avantaj de lefèt ke Thompson Shell pa sèvi ak makè script "#!". Pou kreye pwogram ki genyen plizyè fichye (ki relye tout resous yo nan yon sèl fichye), li sipòte fòmasyon yon dosye ègzèkutabl nan fòm yon achiv ZIP ki fèt espesyalman. Plan fòma yo pwopoze a (egzanp aplikasyon hello.com):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(kòmand -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" sòti 1 REYÈ MÒD... ELF SEGMENTS... OPENBSD NOTE... MACHO HEATERS... KÒD AK DONE... POST ANYÈ...

Nan kòmansman fichye a, se etikèt "MZqFpD" ki endike, ki konsidere kòm yon header fòma Windows PE. Se sekans sa a tou dekode nan enstriksyon "pop %r10; jno 0x4a ; jo 0x4a", ak liy "\177ELF" nan enstriksyon "jg 0x47", ki itilize pou voye nan pwen antre a. Sistèm Unix yo kouri kòd kokiy ki sèvi ak lòd exec, pase kòd la ègzèkutabl nan yon tiyo san non. Yon limit nan metòd yo pwopoze a se kapasite nan kouri sou sistèm opere tankou Unix sèlman lè l sèvi avèk kokiy ki sipòte mòd konpatibilite Thompson Shell.

Rele qemu-x86_64 bay plis portabilite epi li pèmèt kòd konpile pou achitekti x86_64 la kouri sou platfòm ki pa x86, tankou tablo Raspberry Pi ak aparèy Apple ki ekipe ak processeur ARM. Pwojè a kapab tou itilize pou kreye aplikasyon endepandan ki kouri san yo pa yon sistèm opere (fè metal). Nan aplikasyon sa yo, yon bootloader tache ak dosye a ègzèkutabl, ak pwogram nan aji kòm yon sistèm operasyon demaraj.

Estanda C bibliyotèk libc devlope pa pwojè a ofri fonksyon 2024 (nan premye lage a te gen apeprè 1400 fonksyon). An tèm de pèfòmans, Cosmopolitan travay osi vit ke glibc epi li se notables devan Musl ak Newlib, malgre lefèt ke Cosmopolitan se yon lòd nan grandè ki pi piti nan gwosè kòd pase glibc ak apeprè koresponn ak Musl ak Newlib. Pou optimize fonksyon yo rele souvan tankou memcpy ak strlen, yo itilize teknik "pèfòmans koule desann", kote yo itilize yon makro obligatwa pou rele fonksyon an, kote konpilatè a enfòme sou anrejistreman CPU ki enplike nan ekzekisyon kòd la. pwosesis, ki pèmèt ekonomize resous lè ekonomize eta CPU pa sove sèlman rejis chanjan.

Chanjman nan nouvo lage a enkli:

  • Konplo pou jwenn aksè nan resous entèn andedan yon fichye postal yo te chanje (lè ouvèti fichye yo, wout nòmal /zip/... yo itilize kounye a olye pou yo itilize zip:.. prefiks). Menm jan an tou, pou jwenn aksè nan disk nan Windows, li posib pou itilize chemen tankou "/c/..." olye de "C:/...".
  • Yo te pwopoze yon nouvo chajè APE (aktyèlman pòtab ègzekutabl), ki defini fòma dosye inivèsèl ègzèkutabl yo. Nouvo loader a sèvi ak mmap pou mete pwogram nan nan memwa epi li pa chanje kontni an sou vole ankò. Si sa nesesè, dosye inivèsèl ègzèkutabl la ka konvèti nan dosye ègzèkutabl regilye ki mare ak platfòm endividyèl yo.
  • Sou platfòm Linux la, li posib pou itilize modil kernel binfmt_misc pou kouri pwogram APE yo. Li te note ke lè l sèvi avèk binfmt_misc se metòd lansman ki pi rapid.
  • Pou Linux, yo te pwopoze yon aplikasyon fonksyonalite apèl sistèm pledge() ak unveil() devlope pa pwojè OpenBSD la. Yo bay yon API pou itilize apèl sa yo nan pwogram nan C, C++, Python ak Redbean, ansanm ak yon sèvis piblik pledge.com pou izole pwosesis abitrè.
  • Konstriksyon an sèvi ak sèvis piblik Landlock Make la - yon edisyon GNU Make ki gen yon verifikasyon depandans pi sevè ak itilizasyon apèl sistèm Landlock la pou izole pwogram nan ak rès sistèm nan epi amelyore efikasite kachèt la. Kòm yon opsyon, yo kenbe kapasite nan bati ak GNU Make regilye.
  • Fonksyon pou multithreading yo te aplike - _spawn () ak _join (), ki se lyezon inivèsèl sou API espesifik nan sistèm opere diferan. Travay ap fèt tou pou aplike sipò POSIX Threads.
  • Li posib pou itilize mo kle _Thread_local pou itilize depo separe pou chak fil (TLS, Thread-Local Storage). Pa default, C runtime inisyalize TLS pou fil prensipal la, ki te lakòz gwosè minimòm ègzekutabl la ogmante soti nan 12 a 16 KB.
  • Sipò pou "--ftrace" ak "--strace" paramèt yo te ajoute nan dosye ègzèkutabl yo bay enfòmasyon sou tout apèl fonksyon ak apèl sistèm nan stderr.
  • Te ajoute sipò pou apèl sistèm closefrom(), sipòte sou Linux 5.9+, FreeBSD 8+ ak OpenBSD.
  • Sou platfòm Linux la, pèfòmans apèl clock_gettime ak gettimeofday ogmante jiska 10 fwa lè yo itilize mekanis vDSO (virtual dynamic shared object), ki fè li posib pou deplase moun kap okipe apèl sistèm lan nan espas itilizatè yo epi evite chanjman kontèks.
  • Fonksyon matematik pou travay ak nimewo konplèks yo te deplase nan bibliyotèk Musl la. Travay anpil fonksyon matematik te akselere.
  • Yo pwopoze fonksyon nointernet() pou enfim kapasite rezo yo.
  • Te ajoute nouvo fonksyon pou ajoute kòd avèk efikasite: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf ak vappendf.
  • Te ajoute yon vèsyon ki pwoteje fanmi fonksyon kprintf(), ki fèt pou travay ak privilèj ki wo yo.
  • Siyifikativman amelyore pèfòmans aplikasyon SSL, SHA, curve25519 ak RSA.

Sous: opennet.ru

Add nouvo kòmantè