Можно ли отсоединить объектные файлы от исполняемого файла?

Фон: Я смотрю на разработку менеджера пакетов, похожего на 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, следующие.

  1. Возможность только перекомпилировать объектные файлы, которые были обновлены (отслеживать изменения с помощью GIT или иным способом).
  2. Декомпилировать / отменять связь исполняемого файла с объектными файлами.
  3. Перекомпилировать / повторно связать объектные файлы, заменив только старые объектные файлы обновленными объектными файлами (изменения отслеживаются с помощью GIT или иным образом).
  4. Затем вновь скомпилированный пакет заменяет старый пакет. (тривиальное задание)

Обоснование: Я — пользователь 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 «$ldmsgstr «чтобы регистрировать изменения, которые он вносит при связывании объектных файлов, чтобы сделать намеренно сделать программу» обратной Engineerable «???

Редактировать: Другим вариантом использования этого было бы слишком отделение отдельного объектного файла от исполняемого файла большого проекта, чтобы заменить выделенный объектный файл новым и снова связать его. Это уменьшило бы затраты на повторное связывание больших проектов из множества разных файлов при обновлении только одного. Это позволило бы для пошаговой компиляции на двоичном уровне.

1

Решение

Нет, это невозможно. Большая часть работы компоновщика заключается в замене символьных ссылок (допустимых для любой комбинации объектных файлов, связанных вместе) числовыми смещениями (действительными только для конкретного способа, которым компоновщик решил выложить эту конкретную комбинацию объектных файлов в это конкретное время) , Как только ссылки «запекаются» таким образом, их невозможно восстановить.

3

Другие решения

Это может быть выполнимо, если вы измените / настройте ld хранить разделы для каждого объектного файла отдельно, а также хранит таблицу перемещения для каждого объектного файла в исполняемом файле. Также вы должны убедиться, ld сохраняет имена объектных файлов в исполняемом файле, если вы хотите получить исходные имена файлов.

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

0

По вопросам рекламы [email protected]