Загружаемые сборки

Загружаемые сборки (англ. bootstrappable builds) — это процесс компиляции программного обеспечения, не зависящий от (компиляторных) бинарных файлов, которые не были собраны из исходных текстов в рамках этого же процесса[1][2][3].

Данный процесс позволяет защититься от закладок в компиляторах: если процесс сборки не зависит от бинарного кода, аудит которого затруднён, то внедрить скрытую закладку в бинарных файлах компилятора становится невозможно.

Методы

Одним из способов решить эту задачу для дистрибутива программного обеспечения является уменьшение объёма бинарных файлов, используемых для начальной сборки (bootstrap), до тех пор, пока они вовсе не станут не нужны или их размер не уменьшится настолько, чтобы люди могли их легко просмотреть и проверить[4].

Многие компиляторы для разных языков программирования написаны на том же языке, для которого они предназначены. Например, официальный компилятор Go (gc) реализован на языке Go.

Таким образом, без альтернативных компиляторов, например GCC, написанных на других языках (здесь на C и C++), для сборки компилятора Go потребуется бинарная версия предыдущей редакции компилятора Go.

Для реализации загружаемых сборок часто можно найти более старую версию компилятора, которую можно собрать из исходных текстов. Далее возможно написать код, автоматически собирающий последовательно следующие версии компилятора вплоть до современной. Определение, какие версии компиляторов способны собирать последующие, зачастую представляет собой нетривиальную задачу, а сам процесс может быть весьма длительным по времени. Иногда для этого приходится поддерживать старые версии компиляторов и внедрять в них поддержку новых архитектур процессоров, чтобы обеспечить сборку на современных системах. К примеру, GCC 4.7 — последняя версия, которую можно собрать с помощью tcc, а затем использовать её для сборки всех последующих выпусков GCC[5].

Этот процесс можно заменить или дополнить иными способами начального построения (bootstrap) компиляторов.

Например, также возможно создать новый компилятор для языка, написанный на другом языке программирования.

Подобные приёмы позволяют уменьшить размер бинарных файлов, необходимых для инициализации сборки дистрибутива.

Для сборки самого первого компилятора, который затем будет использоваться для построения остальных компиляторов, возможно уменьшить размер исходного бинарника до 357 байт[6], после чего использовать многостадийную процедуру, чтобы получить полноценный компилятор C, и уже на его базе собирать другие компиляторы или программное обеспечение[7].

Проблемы и ограничения

Некоторые программные продукты могут зависеть от самих себя при сборке, причём их первая версия могла быть собрана способом, не соответствующим принципам загружаемых сборок.

Одним из таких примеров является Gradle, который зависит от Scala, а первая версия последней основывалась на проприетарной компонентах[8], а Kotlin требует для сборки самого себя и Gradle[9].

История

Проект «Bootstrappable Builds» был начат в 2016 году как ответвление от инициативы «Reproducible Builds»[3].

В 2022 году система управления пакетами Guix впервые получила возможность собираться, начиная с того самого 357-байтового бинарного файла[6].

Примечания

  1. Guix Further Reduces Bootstrap Seed to 25% — 2020 — Blog — GNU Guix (англ.). guix.gnu.org. Дата обращения: 7 июня 2024. Архивировано 8 января 2021 года.
  2. Bootstrappable builds (англ.). Bootstrappable.org. Дата обращения: 7 июня 2024.
  3. 1 2 Edge, Jake Bootstrappable builds [LWN.net] (англ.). LWN.net (6 января 2021). Дата обращения: 7 июня 2024. Архивировано 7 января 2021 года.
  4. NLnet; GNU Mes: Full Source bootstrap (англ.). nlnet.nl. Дата обращения: 7 июня 2024. Архивировано 14 сентября 2020 года.
  5. Projects (англ.). bootstrappable.org. Дата обращения: 7 июня 2024. Архивировано 3 января 2024 года.
  6. 1 2 [PATCH core-updates 0/8] the Full Source Bootstrap (англ.). guix.gnu.org. Дата обращения: 7 июня 2024. Архивировано 15 мая 2022 года.
  7. Jan Nieuwenhuizen on bootstrappable builds, GNU Mes and GNU Guix (англ.). reproducible-builds.org (18 мая 2022). Дата обращения: 7 июня 2024. Архивировано 20 октября 2025 года.
  8. Bootstrapping JVM languages (англ.). bootstrappable.org. Дата обращения: 7 июня 2024. Архивировано 19 апреля 2020 года.
  9. Bootstrapping Java Tools (англ.). bootstrappable.org. Дата обращения: 7 июня 2024. Архивировано 14 марта 2024 года.