Rilascio della libreria C standard 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 di file eseguibile universale che consente di distribuire programmi per diversi sistemi operativi senza l'utilizzo di interpreti e macchine virtuali. Il risultato ottenuto compilando in GCC e Clang viene compilato in un file eseguibile universale collegato staticamente che può essere eseguito su qualsiasi distribuzione Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD e persino chiamato dal BIOS. Il codice del progetto è distribuito sotto la licenza ISC (una versione semplificata di MIT/BSD).

Il contenitore per la generazione di file eseguibili universali si basa sulla combinazione di segmenti e intestazioni specifici di diversi sistemi operativi (PE, ELF, MACHO, OPENBSD) in un unico file, combinando diversi formati diversi utilizzati in Unix, Windows e macOS. Per garantire che un singolo file eseguibile venga eseguito su sistemi Windows e Unix, un trucco consiste nel codificare i file Windows PE come script di shell, sfruttando il fatto che Thompson Shell non utilizza il contrassegno di script "#!". Per creare programmi che includano più file (collegando tutte le risorse in un unico file), supporta la formazione di un file eseguibile sotto forma di un archivio ZIP appositamente progettato. Schema del format proposto (esempio 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" "$ @" esci 1 MODALITÀ REALE... SEGMENTI ELF... NOTA OPENBSD... INTESTAZIONI MACHO... CODICE E DATI... DIRECTORY ZIP...

All'inizio del file è indicata l'etichetta “MZqFpD”, che viene percepita come un'intestazione del formato Windows PE. Questa sequenza è decodificata anche nell'istruzione “pop %r10; jno 0x4a ; jo 0x4a" e la riga "\177ELF" all'istruzione "jg 0x47", che vengono utilizzate per inoltrare al punto di ingresso. I sistemi Unix eseguono codice shell che utilizza il comando exec, passando il codice eseguibile attraverso una pipe senza nome. Una limitazione del metodo proposto è la capacità di funzionare su sistemi operativi simili a Unix utilizzando solo shell che supportano la modalità di compatibilità Thompson Shell.

La chiamata qemu-x86_64 fornisce ulteriore portabilità e consente l'esecuzione del codice compilato per l'architettura x86_64 su piattaforme non x86, come 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 è allegato al file eseguibile e il programma funge da sistema operativo avviabile.

La libreria C standard libc sviluppata dal progetto offre 2024 funzioni (nella prima versione c'erano circa 1400 funzioni). In termini di prestazioni, Cosmopolitan funziona velocemente come glibc ed è notevolmente più avanti di Musl e Newlib, nonostante Cosmopolitan sia un ordine di grandezza inferiore nella dimensione del codice rispetto a glibc e corrisponda approssimativamente a Musl e Newlib. Per ottimizzare le funzioni richiamate di frequente come memcpy e strlen, viene utilizzata inoltre la tecnica "trickle-down performance", in cui viene utilizzata una macro associazione per richiamare la funzione, in cui il compilatore viene informato sui registri della CPU coinvolti nell'esecuzione del codice processo, che consente di risparmiare risorse durante il salvataggio dello stato della CPU salvando solo i registri modificabili.

Tra le novità della nuova release:

  • È stato modificato lo schema di accesso alle risorse interne di un file zip (all'apertura dei file vengono ora utilizzati i soliti percorsi /zip/... invece del prefisso zip:..). Allo stesso modo, per accedere ai dischi in Windows, è possibile utilizzare percorsi come “/c/...” invece di “C:/...”.
  • È stato proposto un nuovo caricatore APE (Actually Portable Executable), che definisce il formato dei file eseguibili universali. Il nuovo caricatore utilizza mmap per posizionare il programma in memoria e non modifica più il contenuto al volo. Se necessario, il file eseguibile universale può essere convertito in file eseguibili regolari legati a singole piattaforme.
  • Sulla piattaforma Linux è possibile utilizzare il modulo kernel binfmt_misc per eseguire programmi APE. Si noti che l'utilizzo di binfmt_misc è il metodo di avvio più veloce.
  • Per Linux è stata proposta un'implementazione della funzionalità delle chiamate di sistema pledge() e unveil() sviluppate dal progetto OpenBSD. Viene fornita un'API per l'utilizzo di queste chiamate nei programmi in C, C++, Python e Redbean, nonché un'utilità pledge.com per isolare processi arbitrari.
  • La build utilizza l'utilità Landlock Make, un'edizione di GNU Make con un controllo delle dipendenze più rigoroso e l'uso della chiamata di sistema Landlock per isolare il programma dal resto del sistema e migliorare l'efficienza della memorizzazione nella cache. Come opzione, viene mantenuta la possibilità di compilare con il normale GNU Make.
  • Sono state implementate funzioni per il multithreading: _spawn() e _join(), che sono collegamenti universali su API specifiche per diversi sistemi operativi. È inoltre in corso il lavoro per implementare il supporto dei thread POSIX.
  • È possibile utilizzare la parola chiave _Thread_local per utilizzare un'archiviazione separata per ogni thread (TLS, Thread-Local Storage). Per impostazione predefinita, il runtime C inizializza TLS per il thread principale, il che ha causato l'aumento della dimensione minima dell'eseguibile da 12 KB a 16 KB.
  • Il supporto per i parametri “--ftrace” e “--strace” è stato aggiunto ai file eseguibili per fornire informazioni su tutte le chiamate di funzione e di sistema a stderr.
  • Aggiunto il supporto per la chiamata di sistema closefrom(), supportata su Linux 5.9+, FreeBSD 8+ e OpenBSD.
  • Sulla piattaforma Linux, le prestazioni delle chiamate clock_gettime e gettimeofday sono state aumentate fino a 10 volte utilizzando il meccanismo vDSO (virtual Dynamic Shared Object), che rende possibile spostare il gestore delle chiamate di sistema nello spazio utente ed evitare cambi di contesto.
  • Le funzioni matematiche per lavorare con i numeri complessi sono state spostate dalla libreria Musl. Il lavoro di molte funzioni matematiche è stato accelerato.
  • La funzione nointernet() è stata proposta per disabilitare le funzionalità di rete.
  • Aggiunte nuove funzioni per aggiungere stringhe in modo efficiente: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf e vappendf.
  • Aggiunta una versione protetta della famiglia di funzioni kprintf(), progettata per funzionare con privilegi elevati.
  • Prestazioni significativamente migliorate delle implementazioni SSL, SHA, curve25519 e RSA.

Fonte: opennet.ru

Aggiungi un commento