Rilascio della standard C library Cosmopolitan 2.0, sviluppata per file eseguibili portabili

È stato pubblicato il rilascio del progetto Cosmopolitan 2.0, che sviluppa la libreria standard C e un formato universale per file eseguibili utilizzabile per la distribuzione di programmi su diversi sistemi operativi senza l'uso di interpreti e macchine virtuali. Il risultato ottenuto tramite la compilazione in GCC e Clang è assemblato in un file eseguibile universale linkabile staticamente, adatto per l'esecuzione in qualsiasi distribuzione di Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD e persino richiamabile dal BIOS. Il codice del progetto è distribuito con licenza ISC (variante semplificata di MIT/BSD).

Il contenitore per la creazione di file eseguibili universali si basa sulla combinazione di segmenti e intestazioni specifici per diversi sistemi operativi (PE, ELF, MACHO, OPENBSD) in un unico file, combinando al suo interno diversi formati utilizzati in Unix, Windows e macOS. Per garantire l'esecuzione di un file eseguibile sia in Windows che nei sistemi Unix viene utilizzato un trucco relativo alla codifica dei file Windows PE come shell script, approfittando del fatto che il Thompson Shell non utilizza il marcatore di script «#!». Per la creazione di programmi che includono più file (assemblaggio di tutte le risorse in un unico file), è supportata la creazione di un file eseguibile come archivio ZIP appositamente formattato. Lo schema del formato proposto (esempio dell'applicazione 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…

All'inizio del file è indicata l'etichetta «MZqFpD», che viene percepita come intestazione del formato Windows PE. Questa sequenza viene anche decodificata nelle istruzioni «pop %r10 ; jno 0x4a ; jo 0x4a», e la stringa «\177ELF» nelle istruzioni «jg 0x47», che vengono utilizzate per il passaggio al punto di ingresso. Nei sistemi Unix viene eseguito il codice shell, nel quale viene utilizzato il comando exec con la trasmissione del codice eseguibile tramite un canale senza nome. Una limitazione del metodo proposto è che l'esecuzione in sistemi operativi simili a Unix può avvenire solo utilizzando shell che supportano la modalità di compatibilità con il Thompson Shell.

La chiamata a qemu-x86_64 è prevista per implementare ulteriore portabilità e consente di eseguire codice compilato per l'architettura x86_64 su piattaforme diverse da x86, ad esempio su schede Raspberry Pi e dispositivi Apple dotati di processori ARM. Il progetto può essere utilizzato anche per creare applicazioni autonome che funzionano senza sistema operativo (bare metal). In tali applicazioni, un bootloader viene ancorato al file eseguibile e il programma funge da sistema operativo caricabile.

Nella libreria standard C libc sviluppata dal progetto sono state proposte 2024 funzioni (nel primo rilascio c'erano circa 1400 funzioni). Per quanto riguarda le prestazioni, Cosmopolitan funziona altrettanto velocemente di glibc e supera notevolmente Musl e Newlib, nonostante Cosmopolitan abbia un codice di dimensioni significativamente inferiori rispetto a glibc e sia paragonabile a Musl e Newlib. Per ottimizzare le funzioni frequentemente chiamate come memcpy e strlen, viene utilizzata la tecnica della "trickle-down performance", in cui viene applicato un macro-wrapper alla chiamata della funzione, informando il compilatore sui registri CPU utilizzati durante l'esecuzione del codice, il che consente di risparmiare risorse mantenendo lo stato della CPU conservando solo i registri modificabili.

Tra le novità del nuovo rilascio:

  • È stato modificato il modo in cui si accede alle risorse interne all'interno del file zip (ora vengono utilizzati percorsi normali /zip/... per aprire i file invece dell'accesso tramite il prefisso zip:..). Allo stesso modo, per l'accesso ai dischi in Windows è stato fornito un percorso del tipo " /c/..." invece di "C:/...".
  • È stato proposto un nuovo bootloader APE (Actually Portable Executable) che definisce un formato universale per i file eseguibili. Il nuovo bootloader utilizza mmap per collocare il programma in memoria e non modifica più il contenuto al volo. Se necessario, il file eseguibile universale può essere convertito in normali file eseguibili legati a piattaforme specifiche.
  • Sulla piattaforma Linux è stata implementata la possibilità di utilizzare il modulo del kernel binfmt_misc per eseguire programmi APE. Si segnala che l'uso di binfmt_misc è il metodo più veloce per avviare.
  • Per Linux è stata proposta un'implementazione delle funzionalità delle chiamate di sistema pledge() e unveil(), sviluppate dal progetto OpenBSD. Viene fornita un'API per utilizzare queste chiamate nei programmi scritti in C, C++, Python e Redbean, oltre a un'utilità pledge.com per isolare processi arbitrari.
  • Per la compilazione è stata utilizzata l'utilità Landlock Make — una modifica di GNU Make con controlli più rigorosi delle dipendenze e utilizzo della chiamata di sistema Landlock per isolare il programma dal resto del sistema e migliorare l'efficienza della cache. È stata mantenuta la possibilità di compilare anche con il normale GNU Make.
  • Sono state implementate funzioni per la multithreading — _spawn() e _join(), che rappresentano dei wrapper universali su API specifiche per diversi sistemi operativi. Sono in corso i lavori per implementare il supporto a POSIX Threads.
  • È stata fornita la possibilità di utilizzare la parola chiave _Thread_local per il mantenimento di spazi di archiviazione separati per ogni thread (TLS, Thread-Local Storage). Per impostazione predefinita, il runtime C inizializza TLS per il thread principale, il che ha portato a un aumento della dimensione minima dell'eseguibile da 12 a 16 KB.
  • Nei file eseguibili è stato aggiunto il supporto per le opzioni «—ftrace» e «—strace» per stampare su stderr informazioni su tutte le chiamate di funzione e chiamate di sistema.
  • È stato aggiunto il supporto per la chiamata di sistema closefrom(), supportata in Linux 5.9+, FreeBSD 8+ e OpenBSD.
  • Sulla piattaforma Linux la performance delle chiamate clock_gettime e gettimeofday è aumentata fino a 10 volte grazie all'uso del meccanismo vDSO (virtual dynamic shared object), che consente di spostare il gestore della chiamata di sistema nello spazio utente e di evitare i cambi di contesto.
  • Dalla libreria Musl sono state trasferite le funzioni matematiche per lavorare con numeri complessi. Sono state accelerate molte funzioni matematiche.
  • È stata proposta la funzione nointernet(), che disabilita le capacità di rete.
  • Sono state aggiunte nuove funzioni per un'efficace concatenazione di stringhe: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf e vappendf.
  • È stata aggiunta una variante sicura della famiglia di funzioni kprintf(), progettata per essere utilizzata con privilegi elevati.
  • È stata significativamente migliorata la performance delle implementazioni SSL, SHA, curve25519 e RSA.

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster