Фон: Я смотрю на разработку менеджера пакетов, похожего на 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, следующие.
Обоснование: Я — пользователь 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
msgstr «чтобы регистрировать изменения, которые он вносит при связывании объектных файлов, чтобы сделать намеренно сделать программу» обратной Engineerable «???
Редактировать: Другим вариантом использования этого было бы слишком отделение отдельного объектного файла от исполняемого файла большого проекта, чтобы заменить выделенный объектный файл новым и снова связать его. Это уменьшило бы затраты на повторное связывание больших проектов из множества разных файлов при обновлении только одного. Это позволило бы для пошаговой компиляции на двоичном уровне.
Нет, это невозможно. Большая часть работы компоновщика заключается в замене символьных ссылок (допустимых для любой комбинации объектных файлов, связанных вместе) числовыми смещениями (действительными только для конкретного способа, которым компоновщик решил выложить эту конкретную комбинацию объектных файлов в это конкретное время) , Как только ссылки «запекаются» таким образом, их невозможно восстановить.
Это может быть выполнимо, если вы измените / настройте ld
хранить разделы для каждого объектного файла отдельно, а также хранит таблицу перемещения для каждого объектного файла в исполняемом файле. Также вы должны убедиться, ld
сохраняет имена объектных файлов в исполняемом файле, если вы хотите получить исходные имена файлов.
По сути, компоновщик может просто объединить объектные файлы и затем выполнить перемещения, если перемещения необратимы, вы должны иметь возможность полностью изменить процесс.