Предыстория: я рассматриваю возможность разработки менеджера пакетов, похожего на portage в Gentoo Linux (может закончиться тем, что я разветвлю portage). Для тех, кто мало что знает о Gentoo, это дистрибутив на основе исходного кода, что означает, что все пакеты скомпилированы из исходного кода. В настоящее время можно скомпилировать программу в объектные файлы, а затем в исполняемые файлы.
$ gcc -c a.c -o a.o
$ gcc -c b.c -o b.o
$ gcc a.o b.o -o executable
Улучшения, которые я хотел бы внести в portage, заключаются в следующем.
- Возможность перекомпилировать только обновленные объектные файлы (отслеживать изменения с помощью GIT или иным образом).
- Декомпилировать/развязать исполняемый файл с объектными файлами.
- Перекомпилируйте/повторно свяжите объектные файлы, заменив только старые объектные файлы обновленными объектными файлами (изменения отслеживаются с помощью GIT или иным образом).
- Затем вновь скомпилированный пакет заменяет старый пакет. (тривиальная задача)
Обоснование: я пользователь Arch Linux, которому нравится идея дистрибутива на основе исходного кода, но меня не беспокоит огромная задача поддержания моей системы в актуальном состоянии. Я также выполняю большую часть своей работы на портативном компьютере с небольшим жестким диском, отсюда и причина декомпиляции/отключения связи исполняемого файла с объектными файлами, а не просто сохранение объектных файлов, которые занимают много места. Это также, вероятно, уменьшит общее время компиляции системы, поскольку потребность в повторной компиляции большей части исходного кода будет значительно уменьшена. Это также позволило бы легко изменить USE-флаги пакета без необходимости полной перекомпиляции.
Вопрос: можно ли скомпилировать объектные файлы в исполняемый файл, а затем декомпилировать обратно в объектные файлы. Пример этого ниже.
$ gcc -c a.c -o a.o
$ gcc -c b.c -o b.o
$ gcc a.o b.o -o executable
а потом
$ SomeCommand executable
output << a.o b.o
Если это сейчас невозможно. Можно ли изменить версию компоновщика GNU «$ld
», чтобы регистрировать изменения, которые он вносит при связывании объектных файлов, чтобы намеренно сделать программу «обратно спроектированной» ???
Редактировать. Другим вариантом использования этого может быть слишком большое отделение отдельного объектного файла от исполняемого файла большого проекта, чтобы заменить отделенный объектный файл новым и повторно связать его. Это уменьшит накладные расходы на повторное связывание больших проектов из множества разных файлов, когда обновляется только один. Это позволило бы выполнять инкрементную компиляцию на двоичном уровне.
elfsh
(eresi-project.org/wiki/TheELFsh а>). Как именно это могло бы работать, я не в силах, хотя ^_^ - person Johannes Schaub - litb   schedule 03.09.2015.a
:p - person Johannes Schaub - litb   schedule 03.09.2015