Sortie de la bibliothèque standard C Cosmopolitan 2.0, développée pour les fichiers exécutables portables.

La publication de la version 2.0 du projet Cosmopolitan a été réalisée, développant la bibliothèque standard en C et un format universel de fichiers exécutables, pouvant être utilisé pour la distribution de programmes sur divers systèmes d'exploitation sans recourir à des interprètes ou des machines virtuelles. Le résultat obtenu via la compilation avec GCC et Clang est assemblé dans un fichier exécutable universel statiquement lié, qui est apte à être exécuté sur n'importe quelle distribution de Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD et même à être appelé depuis le BIOS. Le code du projet est distribué sous la licence ISC (version simplifiée de MIT/BSD).

Le conteneur pour la création de fichiers exécutables universels est basé sur la combinaison de segments et d'en-têtes spécifiques à différents systèmes d'exploitation (PE, ELF, MACHO, OPENBSD) dans un seul fichier, combinant plusieurs formats différents utilisés dans Unix, Windows et macOS. Pour permettre l'exécution d'un même fichier exécutable sous Windows et dans les systèmes Unix, une astuce est utilisée, consistant à encoder les fichiers Windows PE sous forme de script shell, en profitant du fait que Thompson Shell n'utilise pas le marqueur de script «#!». Pour créer des programmes incluant plusieurs fichiers (assemblage de toutes les ressources dans un seul fichier), le formatage d'un fichier exécutable sous la forme d'une archive ZIP spécialement formatée est pris en charge. Le schéma du format proposé (exemple de l'application hello.com) :

MZqFpD=’ SECTEUR DE DÉMARRAGE BIOS’ exec 7 $(command -v $0) printf ‘\177ELF…EN-TÊTE-ENCODÉE-LIAISON-FREEBSD’ >&7 exec «$0» «$@» exec qemu-x86_64 «$0» «$@» exit 1 MODE RÉEL… SEGMENTS ELF… REMARQUE OPENBSD… EN-TÊTES MACHO… CODE ET DONNÉES… RÉPERTOIRE ZIP…

Au début du fichier, il y a une étiquette «MZqFpD», qui est perçue comme l'en-tête du format Windows PE. Cette séquence est également décodée en l'instruction «pop %r10 ; jno 0x4a ; jo 0x4a», et la chaîne «\177ELF» en l'instruction «jg 0x47», utilisées pour passer au point d'entrée. Dans les systèmes Unix, du code shell est exécuté, utilisant la commande exec avec le passage du code exécutable par un canal anonyme. La contrainte de la méthode proposée est la possibilité d'exécution uniquement dans les systèmes d'exploitation de type Unix en utilisant des shells compatibles avec le mode de compatibilité Thompson Shell.

L'appel à qemu-x86_64 est prévu pour réaliser une portabilité supplémentaire et permet d'exécuter du code compilé pour l'architecture x86_64 sur des plateformes autres que x86, comme sur des cartes Raspberry Pi et des appareils Apple équipés de processeurs ARM. Le projet peut également être utilisé pour créer des applications autonomes fonctionnant sans système d'exploitation (bare metal). Dans de telles applications, un chargeur est attaché au fichier exécutable, et le programme agit comme un système d'exploitation chargé.

La bibliothèque standard C libc développée par le projet propose 2024 fonctions (il y avait environ 1400 fonctions dans la première version). En termes de performance, Cosmopolitan fonctionne aussi rapidement que glibc et dépasse nettement Musl et Newlib, tout en étant d'une taille de code d'un ordre de grandeur inférieure à celle de glibc et correspondant à peu près à Musl et Newlib. Pour optimiser les fonctions souvent appelées comme memcpy et strlen, une technique de « trickle-down performance » est utilisée, où un macro-emballage est appliqué pour l'appel de la fonction, permettant au compilateur d'être informé des registres CPU impliqués dans l'exécution du code, ce qui permet d'économiser des ressources en sauvegardant seulement les registres modifiés.

Parmi les changements de la nouvelle version :

  • Le schéma d'accès aux ressources internes à l'intérieur d'un fichier zip a été modifié (lors de l'ouverture de fichiers, des chemins normaux /zip/... sont maintenant utilisés au lieu d'un accès par le préfixe zip:..). De même, pour l'accès aux disques sous Windows, il est désormais possible d'utiliser des chemins du type « /c/... » au lieu de « C:/... ».
  • Un nouveau chargeur APE (Actually Portable Executable) a été proposé, définissant le format des fichiers exécutables universels. Ce nouveau chargeur utilise mmap pour placer le programme en mémoire et ne modifie plus le contenu à la volée. Au besoin, un fichier exécutable universel peut être converti en fichiers exécutables normaux liés à des plateformes spécifiques.
  • Sur la plateforme Linux, la possibilité d'utiliser le module du noyau binfmt_misc pour exécuter des programmes APE a été mise en œuvre. Il est noté que l'utilisation de binfmt_misc est le moyen le plus rapide de lancer.
  • Pour Linux, une implémentation des fonctionnalités des appels système pledge() et unveil(), développées par le projet OpenBSD, est proposée. Une API est fournie pour utiliser ces appels dans des programmes en C, C++, Python et Redbean, ainsi qu'un outil pledge.com pour isoler des processus arbitraires.
  • Pour la compilation, l'outil Landlock Make — une version de GNU Make avec un contrôle des dépendances plus strict et utilisant l'appel système Landlock pour isoler le programme du reste du système et améliorer l'efficacité du cache — est utilisé. Il est également possible d'utiliser l'édition standard de GNU Make.
  • Des fonctions pour le multithreading — _spawn() et _join(), qui constituent des wrappers universels autour des API spécifiques à différents systèmes d'exploitation — ont été mises en œuvre. Des travaux sont également en cours pour supporter les Threads POSIX.
  • La possibilité d'utiliser le mot-clé _Thread_local pour des espaces de stockage spécifiques à chaque thread (TLS, Thread-Local Storage) a été offerte. Par défaut, le runtime C initialise TLS pour le thread principal, ce qui a entraîné une augmentation de la taille minimale de l'exécutable de 12 à 16 Ko.
  • Le support des options «—ftrace» et «—strace» a été ajouté aux fichiers exécutables pour afficher dans stderr des informations sur tous les appels de fonctions et d'appels système.
  • Le support de l'appel système closefrom(), pris en charge dans Linux 5.9+, FreeBSD 8+ et OpenBSD, a été ajouté.
  • Sur la plateforme Linux, les performances des appels clock_gettime et gettimeofday ont été augmentées jusqu'à 10 fois grâce à l'utilisation du mécanisme vDSO (objet partagé dynamique virtuel), qui permet de transférer le gestionnaire d'appels système dans l'espace utilisateur et d'éviter les commutations de contexte.
  • Des fonctions mathématiques de la bibliothèque Musl ont été transférées pour travailler avec des nombres complexes. De nombreuses fonctions mathématiques ont été accélérées.
  • Une fonction nointernet() a été proposée, désactivant les capacités réseau.
  • De nouvelles fonctions pour la concaténation efficace de chaînes ont été ajoutées : appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf et vappendf.
  • Une variante sécurisée de la famille de fonctions kprintf(), conçue pour un fonctionnement avec des privilèges élevés, a été ajoutée.
  • Les performances des mises en œuvre ont été considérablement améliorées SSL, SHA, curve25519 et RSA.

Source : opennet.ru

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster