A reproducible C toolchain rooted on POSIX shell
quality 7/10 · good
0 net
A fully reproducible C toolchain rooted on POSIX shell Accéder au contenu principal A fully reproducible C toolchain rooted on POSIX shell Thèse ou mémoire / Thesis or Dissertation En cours de chargement... Fichiers Huberdeau_Laurent_2026_memoire.pdf (925.77 KB) Date de publication 2026-01 Autrices et auteurs Huberdeau, Laurent ORCID 0009-0000-7282-4621 Contributrices et contributeurs Direction de recherche Feeley, Marc Publié dans Date de la Conférence Lieu de la Conférence Éditeur Cycle d'études Maîtrise / Master's Programme Informatique Affiliation Mots-clés Bootstrapping C POSIX shell Compilation reproductible Auto-amorçage Reproducible builds Organisme subventionnaire Résumé Les attaques de chaîne d'approvisionnement sont de plus en plus communes et sont notamment difficiles à détecter. La compilation reproductible (reproducible builds) est une manière de prévenir ces attaques, en permettant à quiconque de recréer les artefacts de compilation de manière exacte (bit à bit) à partir du code source. Or, les outils de compilation nécessaires pour recréer ces artefacts sont à leur tour vulnérables à ces attaques. Ainsi, une solution complète au problème de chaîne d'approvisionnement doit inclure la compilation reproductible de tous ces outils. Avec ce problème comme motivation, nous démontrons l'utilité des shells POSIX, disponibles sur la grande majorité des ordinateurs, comme point de départ pour la compilation reproductible. Pour ce faire, nous présentons pnut-sh, un compilateur C vers POSIX shell écrit en C dont la sortie est conçue pour être lisible. Puisque le compilateur peut s'auto-compiler, il est donc possible de produire un script implémentant un compilateur C qui ne nécessite qu'un shell conforme à la spécification POSIX tels que bash, ksh, zsh, etc. Ensemble, pnut-sh et le shell servent alors de point de départ pour la compilation d'une série d'outils de plus en plus complets jusqu'à atteindre une version récente du GNU Compiler Collection (GCC). GCC peut alors servir de fondation pour tout autre outil. Afin de pouvoir passer de l'environnement limité du shell au reste du système d'exploitation, nous présentons également pnut-exe, un compilateur C plus complet produisant des exécutables x86, ainsi qu'une implémentation sur mesure de la bibliothèque standard C depuis lesquels le Tiny C Compiler (TCC) peut être compilé. TCC peut ensuite être utilisé pour amorcer GCC. Le résultat est une chaîne de compilation produite exclusivement à partir d'un shell et de fichiers source lisibles. Nous discutons de comment compiler reproductiblement TCC à partir du shell POSIX, le niveau de support pour le langage C requis pour atteindre cet objectif, l'architecture des deux versions de pnut, la génération de code shell POSIX portable et suffisamment performant, et finalement, l'empaquetage et la distribution des fichiers servant au processus de compilation reproductible de TCC. Software supply chain attacks are increasingly frequent and can be hard to guard against. Reproducible builds ensure that generated artifacts (executable programs) can be reliably created from their source code. However, the tools used by the build process are also vulnerable to supply chain attacks, so a complete solution must also include reproducible builds for the various compilers used. With this problem as our main motivation, we demonstrate that the widely available POSIX shell can serve as the only trusted pre-built binary for reproducible builds by presenting pnut-sh, a C to POSIX shell transpiler written in C that generates human-readable shell code. Because the compiler is self-applicable, it is possible to distribute a human-readable shell script implementing a C compiler that depends only on the existence of a POSIX-compliant shell such as bash, ksh, zsh, etc. Together, pnut-sh and the shell serve as the seed for a chain of builds that create increasingly capable compilers up to the most recent version of the GNU Compiler Collection (GCC), which is a convenient basis to build any other required tool in the toolchain. To bridge from POSIX shell to the rest of the operating system, we also present pnut-exe, a more fully-featured C compiler that targets x86 and its bespoke C standard library implementation from which the Tiny C Compiler (TCC) can be compiled. In turn, TCC can then be used to bootstrap GCC. The end result is a complete build toolchain built only from a shell and human-readable source files. We discuss how TCC can be reproducibly built from POSIX shell, the level of C language support needed to achieve this goal, the architecture of both versions of pnut, the generation of portable and performant POSIX shell code from C, and finally, the packaging and distribution of the files used in the reproducible build process. Table des matières Notes Notes URI https://hdl.handle.net/1866/44051 https://doi.org/10.71781/34098 Autre version linguistique Ensemble de données lié Collections Faculté des arts et des sciences – Département d'informatique et de recherche opérationnelle - Thèses et mémoires Approbation Évaluation Complété par Référencé par Notice complète Ce document diffusé sur Papyrus est la propriété exclusive des titulaires des droits d'auteur et est protégé par la Loi sur le droit d'auteur (L.R.C. (1985), ch. C-42). Sauf si le document est diffusé sous une licence Creative Commons, il ne peut être utilisé que dans le cadre d'une utilisation équitable et non commerciale comme le prévoit la Loi (i.e. à des fins d'étude privée ou de recherche, de critique ou de compte-rendu). Pour toute autre utilisation, une autorisation écrite des titulaires des droits d'auteur sera nécessaire.