Utgivning av den standardiserade C-biblioteket Cosmopolitan 2.0, som utvecklas för bÀrbara körbara filer

UtgÄvan av projektet Cosmopolitan 2.0 har publicerats, som utvecklar ett standard C-bibliotek och ett universellt format för körbara filer som kan anvÀndas för att distribuera program för olika operativsystem utan att anvÀnda tolkar och virtuella maskiner. Resultatet som erhÄlls genom att kompilera i GCC och Clang sammanstÀlls i en statiskt lÀnkad universell körbar fil, som Àr lÀmplig för körning i vilken distribution som helst av Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD och till och med aktivering frÄn BIOS. Kodprojektet distribueras under ISC-licensen (en förenklad variant av MIT/BSD).

Containern för att skapa universella körbara filer Àr baserad pÄ att kombinera segmentspecifika för olika operativsystem och rubriker (PE, ELF, MACHO, OPENBSD) i en fil, vilket kombinerar flera olika format som anvÀnds i Unix, Windows och macOS. För att möjliggöra körningen av en körbar fil i Windows och Unix-system anvÀnds ett knep som involverar att koda Windows PE-filer som ett shell-skript, med hjÀlp av det faktum att Thompson Shell inte anvÀnder skriptmarkörerna "#!". För att skapa program som inkluderar flera filer (sammanstÀllning av alla resurser i en fil) stöds skapandet av en körbar fil i form av ett sÀrskilt utformat ZIP-arkiv. Schemat för det föreslagna formatet (exempel pÄ applikation hello.com):

MZqFpD=’ BIOS BOOT SECTOR’ exec 7 $(command -v $0) printf ‘\177ELF
LINKER-ENCODED-FREEBSD-HEADER’ >&7 exec "${0}" "${@}" exec qemu-x86_64 "${0}" "${@}" exit 1 REAL MODE
 ELF SEGMENTS
 OPENBSD NOTE
 MACHO HEADERS
 CODE AND DATA
 ZIP DIRECTORY


I början av filen anges etiketten "MZqFpD", som uppfattas som rubrik för Windows PE-formatet. Denna sekvens avkodas ocksÄ i instruktionen "pop %r10 ; jno 0x4a ; jo 0x4a", och strÀngen "\177ELF" i instruktionen "jg 0x47", som anvÀnds för att dirigera till ingÄngspunkten. I Unix-system körs shell-kod, dÀr kommandot exec anvÀnds med överlÄtelse av körbar kod genom en namnlös kanal. En begrÀnsning av den föreslagna metoden Àr att körning i Unix-liknande operativsystem endast Àr möjligt med hjÀlp av skal som stöder kompatibilitetslÀget med Thompson Shell.

Anropet qemu-x86_64 Àr avsett för att uppnÄ ytterligare portabilitet och möjliggör körning av kod kompilerad för x86_64-arkitekturen pÄ plattformar som inte Àr x86, till exempel pÄ Raspberry Pi-kort och enheter frÄn Apple, utrustade med ARM-processorer. Projektet kan ocksÄ anvÀndas för att skapa fristÄende applikationer som fungerar utan operativsystem (bare metal). I sÄdana applikationer kopplas en bootloader till den exekverbara filen, och programmet fungerar som det bootbara operativsystemet.

I det standard C-bibliotek som utvecklas av projektet libc föreslĂ„s 2024 funktioner (i det första utskicket fanns det omkring 1400 funktioner). Cosmopolitan presterar lika snabbt som glibc och övertrĂ€ffar tydligt Musl och Newlib, samtidigt som Cosmopolitan Ă€r betydligt mindre i kodstorlek Ă€n glibc och ungefĂ€r motsvarar Musl och Newlib. För att optimera ofta anropade funktioner som memcpy och strlen anvĂ€nds dessutom en teknik som kallas „trickle-down performance”, dĂ€r en makro-wrapper anvĂ€nds för funktionsanropet, vilket informerar kompileraren om de CPU-register som anvĂ€nds under körningen, vilket sparar resurser genom att endast spara de förĂ€nderliga registren.

Bland förÀndringarna i den nya versionen:

  • Schemat för att nĂ„ interna resurser inom zip-filer har Ă€ndrats (vid öppning av filer anvĂ€nds nu vanliga sökvĂ€gar /zip/
 istĂ€llet för att referera med prefixet zip:..). PĂ„ liknande sĂ€tt har möjlighet till anvĂ€ndning av sökvĂ€gar av typen „/c/
” istĂ€llet för „C:/
” införts för Ă„tkomst till diskar i Windows.
  • En ny bootloader APE (Actually Portable Executable) har föreslagits, som definierar formatet för universella exekverbara filer. Den nya bootloadern anvĂ€nder mmap för att placera programmet i minnet och Ă€ndrar inte innehĂ„llet i realtid. Om det behövs kan den universella exekverbara filen konverteras till vanliga exekverbara filer som Ă€r kopplade till specifika plattformar.
  • PĂ„ Linux-plattformen har möjligheten att anvĂ€nda kĂ€rnmodulen binfmt_misc för att köra APE-program implementerats. Det pĂ„pekas att anvĂ€ndningen av binfmt_misc Ă€r den snabbaste metoden för att köra.
  • För Linux föreslĂ„s en implementation av systemanropen pledge() och unveil(), som utvecklas av OpenBSD-projektet. Ett API erbjuds för att anvĂ€nda dessa anrop i program skrivna i C, C++, Python och Redbean, samt verktyget pledge.com för att isolera godtyckliga processer.
  • För kompilering anvĂ€nds verktyget Landlock Make — en version av GNU Make med strĂ€ngare beroendekontroll och anvĂ€ndning av systemanropet Landlock för att isolera programmet frĂ„n resten av systemet och öka cache-effektiviteten. Möjligheten att kompilera med vanlig GNU Make har bevarats som ett alternativ.
  • Funktioner för multitrĂ„dning har implementerats — _spawn() och _join(), som utgör universella wrapper runt API:er specifika för olika operativsystem. Arbetet med att implementera stöd för POSIX-trĂ„dar pĂ„gĂ„r.
  • Det har tillhandahĂ„llits möjlighet att anvĂ€nda nyckelordet _Thread_local för att anvĂ€nda separata lagringsutrymmen för varje trĂ„d (TLS, Thread-Local Storage). Som standard initialiserar C-runtime TLS för huvudtrĂ„den, vilket har lett till att den minimi storlek pĂ„ den körbara filen har ökat frĂ„n 12 till 16 KB.
  • I de körbara filerna har stöd för parametrarna "—ftrace" och "—strace" lagts till för att skriva ut information om alla funktions- och systemanrop till stderr.
  • Stöd för systemanropet closefrom() har lagts till, vilket stöds i Linux 5.9+, FreeBSD 8+ och OpenBSD.
  • PĂ„ Linux-plattformen har prestandan för anropen clock_gettime och gettimeofday ökat upp till 10 gĂ„nger tack vare anvĂ€ndningen av vDSO (virtual dynamic shared object) mekanismen, som gör det möjligt att flytta systemanropsbehandlaren till anvĂ€ndutrymmet och undvika kontextbyten.
  • Matematiska funktioner för arbete med komplexa tal har överförts frĂ„n Musl-biblioteket. MĂ„nga matematiska funktioner har blivit snabbare.
  • Funktionen nointernet() har föreslagits för att stĂ€nga av nĂ€tverksfunktioner.
  • Nya funktioner för effektiv strĂ€ngsammanfogning har lagts till: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf och vappendf.
  • En sĂ€ker variant av familjen funktioner kprintf() har lagts till, avsedd för anvĂ€ndning med höjda privilegier.
  • Prestandan för implementationerna har ökat avsevĂ€rt SSL, SHA, curve25519 och RSA.

KĂ€lla: opennet.ru

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster