Las compilaciones autoarrancables son un proceso de compilación de software que no depende de binarios (del compilador) que no se generan a partir del código fuente mediante este proceso. [ 1 ] [ 2 ] [ 3 ] [ 4 ]
Este proceso puede proteger contra las puertas traseras del compilador : si el proceso de compilación no depende de código binario difícil de auditar, entonces una puerta trasera del compilador ya no podrá ocultarse en los binarios del compilador.
Las compilaciones autoarrancables minimizan la dependencia de herramientas precompiladas y opacas utilizadas para compilar software. Los compiladores y las herramientas de compilación necesarios se construyen a partir del código fuente a través de etapas sucesivas, comenzando con una semilla de arranque pequeña y auditable.
Métodos
Una forma de abordar el problema para una distribución de software es reducir el tamaño de los binarios utilizados para arrancar la distribución hasta que ya no sean necesarios o hasta que el tamaño sea lo suficientemente pequeño como para que los humanos puedan revisarlo fácilmente. [ 5 ]
Muchos compiladores para diversos lenguajes de programación están escritos en el lenguaje al que están dirigidos. Por ejemplo, el compilador oficial de Go (gc) está escrito en Go.
Por lo tanto, sin compiladores alternativos como GCC , que están escritos en otro lenguaje de programación (en este caso, C y C++), el compilador de Go requeriría la compilación de un binario de una versión anterior del mismo.
Para lograr compilaciones autoarrancables, a menudo es posible encontrar una versión anterior del compilador que se pueda compilar desde el código fuente. A partir de ahí, se puede escribir código para compilar automáticamente versiones sucesivas del compilador hasta alcanzar una versión reciente. Identificar qué versiones pueden compilar otras suele ser complejo y puede resultar en tiempos de compilación muy largos durante el proceso de arranque. Esto a veces también requiere mantener versiones anteriores del compilador y adaptar la compatibilidad a arquitecturas de CPU más recientes para permitir el arranque en sistemas modernos. Por ejemplo, GCC 4.7 es la última versión que se puede compilar usando tcc , pero luego se puede usar para compilar versiones más recientes de GCC. [ 6 ]
Este proceso también puede sustituirse o combinarse con otros métodos para inicializar los compiladores.
Por ejemplo, también es posible escribir un nuevo compilador para un lenguaje que esté escrito en otro lenguaje.
Estas técnicas pueden utilizarse para reducir el tamaño de los archivos binarios empleados para inicializar una distribución.
En cuanto a la construcción del primer compilador que pueda construir los compiladores subsiguientes, es posible reducir el tamaño a un único binario de 357 bytes [ 7 ] y a partir de ahí utilizar múltiples etapas en el procedimiento de arranque para poder construir un compilador C, y a partir de ahí construir los demás compiladores o software. [ 8 ]
Desafíos
El software puede depender de sí mismo para compilarse, y la primera versión podría haberse compilado de una manera que no permita el arranque desde cero.
Gradle es uno de esos casos, ya que depende de Scala , que tenía una dependencia propietaria en su primera versión, [ 9 ] y Kotlin , que depende de sí mismo y de Gradle para ser compilado. [ 10 ]
Historia
El proyecto Bootstrappable Builds se inició en 2016 como un derivado del proyecto Reproducible Builds. [ 3 ]
En 2022, Guix adquirió la capacidad de ser compilado a partir del mencionado binario de 357 bytes. [ 7 ]
Véase también
Referencias
- ↑ "Guix reduce aún más la semilla de arranque al 25% — 2020 — Blog — GNU Guix" .
- ↑ "Builds Bootstrappable" . Bootstrappable.org . Consultado el 16 de diciembre de 2022 .
- 1 2 Edge, Jake (6 de enero de 2021). "Builds Bootstrapable [ LWN.net ] " .
- ↑ "Impulsando Linux desde sus cimientos" .
- ↑ "NLnet; GNU Mes: Arranque de código fuente completo" .
- ↑ "Proyectos" .
- 1 2 " [ PATCH core-updates 0/8 ] el arranque de código fuente completo" .
- ↑ https://reproducible-builds.org/news/2022/05/18/jan-nieuwenhuizen-on-bootrappable-builds-gnu-mes-and-gnu-guix/
- ↑ "Arranque de lenguajes JVM" .
- ↑ "Herramientas de arranque de Java" .
Enlaces externos
- bootstrapable.org
- Herramientas de compilación