Izdanje standardne C biblioteke Cosmopolitan 2.0, razvijene za prijenosne izvršne datoteke

Objavljeno je izdanje projekta Cosmopolitan 2.0 koji razvija standardnu ​​C biblioteku i univerzalni format izvršne datoteke koji se može koristiti za distribuciju programa za različite operativne sustave bez upotrebe tumača i virtualnih strojeva. Rezultat dobiven prevođenjem u GCC i Clang kompajlira se u statički povezanu univerzalnu izvršnu datoteku koja se može pokrenuti na bilo kojoj Linux distribuciji, macOS-u, Windowsu, FreeBSD-u, OpenBSD-u, NetBSD-u, pa čak i pozvati iz BIOS-a. Projektni kod distribuira se pod licencom ISC (pojednostavljena verzija MIT/BSD).

Spremnik za generiranje univerzalnih izvršnih datoteka temelji se na kombiniranju segmenata i zaglavlja specifičnih za različite operativne sustave (PE, ELF, MACHO, OPENBSD) u jednu datoteku, kombinirajući nekoliko različitih formata koji se koriste u Unixu, Windowsu i macOS-u. Kako bi se osiguralo da se jedna izvršna datoteka izvodi na Windows i Unix sustavima, trik je kodirati Windows PE datoteke kao skripte ljuske, koristeći prednost činjenice da Thompson Shell ne koristi oznaku skripte "#!". Za izradu programa koji uključuju nekoliko datoteka (povezivanje svih resursa u jednu datoteku), podržava formiranje izvršne datoteke u obliku posebno dizajnirane ZIP arhive. Shema predloženog formata (primjer aplikacije hello.com):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(naredba -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" izlaz iz 1 STVARNOG NAČINA… VILENJAČKI SEGMENTI… OPENBSD BILJEŠKA… MACHO ZAGLAVLJA… KOD I PODACI… ZIP DIREKTOR…

Na početku datoteke navedena je oznaka "MZqFpD", koja se percipira kao zaglavlje Windows PE formata. Ova sekvenca je također dekodirana u instrukciji “pop %r10; jno 0x4a ; jo 0x4a", i linija "\177ELF" do instrukcije "jg 0x47", koje se koriste za prosljeđivanje do ulazne točke. Unix sustavi pokreću shell kod koji koristi naredbu exec, propuštajući izvršni kod kroz neimenovanu cijev. Ograničenje predložene metode je mogućnost pokretanja na operativnim sustavima sličnim Unixu samo pomoću ljuski koje podržavaju način kompatibilnosti Thompson Shell.

Poziv qemu-x86_64 pruža dodatnu prenosivost i omogućuje izvođenje koda kompiliranog za x86_64 arhitekturu na ne-x86 platformama, kao što su Raspberry Pi ploče i Apple uređaji opremljeni ARM procesorima. Projekt se također može koristiti za stvaranje samostalnih aplikacija koje rade bez operativnog sustava (goli metal). U takvim aplikacijama, bootloader je priložen izvršnoj datoteci, a program se ponaša kao operativni sustav koji se može pokrenuti.

Standardna C biblioteka libc razvijena projektom nudi 2024 funkcije (u prvom izdanju bilo je oko 1400 funkcija). Što se tiče performansi, Cosmopolitan radi jednako brzo kao glibc i primjetno je ispred Musla i Newliba, unatoč činjenici da je Cosmopolitan red veličine manji u veličini koda od glibca i približno odgovara Muslu i Newlibu. Za optimizaciju često pozivanih funkcija kao što su memcpy i strlen, dodatno se koristi tehnika "trickle-down performance", u kojoj se makro vezanje koristi za pozivanje funkcije, u kojoj se kompajler informira o CPU registrima koji su uključeni u izvršavanje koda. proces, koji omogućuje uštedu resursa prilikom spremanja CPU stanja spremanjem samo promjenjivih registara.

Među promjenama u novom izdanju:

  • Promijenjena je shema za pristup internim resursima unutar zip datoteke (prilikom otvaranja datoteka, sada se koriste uobičajeni /zip/... putovi umjesto upotrebe zip:.. prefiksa). Slično tome, za pristup diskovima u sustavu Windows moguće je koristiti staze poput “/c/...” umjesto “C:/...”.
  • Predložen je novi APE (Actually Portable Executable) program za učitavanje, koji definira format univerzalnih izvršnih datoteka. Novi učitavač koristi mmap za postavljanje programa u memoriju i više ne mijenja sadržaj u hodu. Ako je potrebno, univerzalna izvršna datoteka može se pretvoriti u regularne izvršne datoteke vezane za pojedinačne platforme.
  • Na Linux platformi moguće je koristiti kernel modul binfmt_misc za pokretanje APE programa. Napominje se da je korištenje binfmt_misc najbrža metoda pokretanja.
  • Za Linux je predložena implementacija funkcionalnosti pledge() i unveil() sistemskih poziva razvijenih u OpenBSD projektu. Omogućen je API za korištenje ovih poziva u programima u C, C++, Python i Redbean, kao i uslužni program pledge.com za izolaciju proizvoljnih procesa.
  • Gradnja koristi uslužni program Landlock Make - izdanje GNU Make sa strožom provjerom ovisnosti i korištenjem Landlock sistemskog poziva za izolaciju programa od ostatka sustava i poboljšanje učinkovitosti predmemoriranja. Kao opcija, zadržava se mogućnost izgradnje s običnim GNU Makeom.
  • Implementirane su funkcije za višenitnost - _spawn() i _join(), koje su univerzalna povezivanja preko API-ja specifičnih za različite operativne sustave. Također se radi na implementaciji podrške za POSIX Threads.
  • Moguće je koristiti ključnu riječ _Thread_local za korištenje zasebne pohrane za svaku nit (TLS, Thread-Local Storage). Prema zadanim postavkama, C runtime inicijalizira TLS za glavnu nit, što je uzrokovalo povećanje minimalne izvršne veličine s 12 na 16 KB.
  • Podrška za parametre “--ftrace” i “--strace” dodana je izvršnim datotekama za izlaz informacija o svim pozivima funkcija i pozivima sustava u stderr.
  • Dodana podrška za sistemski poziv closefrom(), podržan na Linux 5.9+, FreeBSD 8+ i OpenBSD.
  • Na platformi Linux, izvedba poziva clock_gettime i gettimeofday povećana je do 10 puta upotrebom vDSO (virtualnog dinamičkog dijeljenog objekta) mehanizma, koji omogućuje premještanje rukovatelja sistemskim pozivima u korisnički prostor i izbjegavanje kontekstnih prekidača.
  • Matematičke funkcije za rad s kompleksnim brojevima premještene su iz Musl biblioteke. Rad mnogih matematičkih funkcija je ubrzan.
  • Funkcija nointernet() predložena je za onemogućavanje mrežnih mogućnosti.
  • Dodane nove funkcije za učinkovito dodavanje nizova: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf i vappendf.
  • Dodana je zaštićena verzija obitelji funkcija kprintf(), dizajnirana za rad s povišenim privilegijama.
  • Značajno poboljšana izvedba SSL, SHA, curve25519 i RSA implementacija.

Izvor: opennet.ru

Dodajte komentar