Фаза связывания в distcc - PullRequest
       21

Фаза связывания в distcc

4 голосов
/ 21 сентября 2010

Есть ли какая-либо конкретная причина, по которой этап компоновки при создании проекта с помощью distcc выполняется локально, а не отправляется на другие компьютеры, как при компиляции? Чтение белых страниц distcc не дало четкого ответа, но я предполагаю, что время, затрачиваемое на связывание объектных файлов, не очень существенно по сравнению с компиляцией. Есть мысли?

Ответы [ 3 ]

7 голосов
/ 21 сентября 2010

Способ работы distcc заключается в локальной обработке входных файлов до тех пор, пока не будет создан один модуль преобразования файлов.Затем этот файл отправляется по сети и компилируется.На этом этапе удаленному серверу distcc нужен только компилятор, ему даже не нужны файлы заголовков для проекта.Выходные данные компиляции затем перемещаются обратно на клиент и сохраняются локально как объектный файл.Обратите внимание, что это означает, что не только связывание, но и предварительная обработка выполняется локально.Такое разделение работы является общим для других инструментов сборки, таких как ccache (предварительная обработка всегда выполняется, затем он пытается разрешить ввод с ранее кэшированными результатами, а в случае успеха возвращает двоичный файл без перекомпиляции).

Если выДля реализации распределенного компоновщика вам нужно будет либо убедиться, что все узлы в сети имеют одинаковую конфигурацию, либо вы должны будете отправить все необходимые входные данные для операции в одном пакете.Это подразумевало бы, что распределенная компиляция создаст набор объектных файлов, и все эти объектные файлы должны быть переданы по сети для удаленной системы, чтобы связать и вернуть связанный файл.Обратите внимание, что для этого могут потребоваться системные библиотеки, которые упоминаются и присутствуют в пути компоновщика, но не присутствуют в командной строке компоновщика, поэтому «предварительная ссылка» должна была бы определить, какой набор библиотек фактически требуется отправить.Даже если это возможно, для этого потребуется, чтобы локальная система угадывала / вычисляла все реальные зависимости и отправляла их с большим влиянием на сетевой трафик и могла фактически замедлить процесс, так как стоимость отправки может быть больше, чем стоимость связывания --ifстоимость получения зависимостей сама по себе не так высока, как связывание.

Проект, над которым я сейчас работаю, имеет один статически связанный исполняемый файл более 100M.Статические библиотеки различаются по размеру, но если распределенная система сочтет, что конечный исполняемый файл должен быть связан удаленно, то это потребует, вероятно, в три-пять раз больше сетевого трафика, чем конечного исполняемого файла (шаблоны, встроенные строки ... все это появляется во всехединицы перевода, которые включают их, поэтому по сети будет летать несколько копий.

2 голосов
/ 21 сентября 2010

Причина, по которой комплимент может быть отправлен на другие машины, заключается в том, что каждый исходный файл компилируется независимо от других. Проще говоря, для каждого входного файла .c имеется выходной файл .o с этапа компиляции. Это можно сделать на любом количестве разных машин.

С другой стороны, связывание собирает все файлы .o и создает один выходной двоичный файл. Там не так много, чтобы распространять там.

2 голосов
/ 21 сентября 2010

Связывание, почти по определению, требует, чтобы у вас были все объектные файлы в одном месте.Поскольку distcc сначала удаляет объектные файлы на компьютере, который вызвал distcc, локальный компьютер является лучшим местом для выполнения связи, так как объекты уже присутствуют.

Кроме того, удаленное связывание станет особенно проблематичным.как только вы начнете бросать библиотеки в микс.Если удаленный компьютер связал вашу программу с локальной версией библиотеки, вы открыли потенциальные проблемы, когда связанный двоичный файл был возвращен на локальный компьютер.

...