Проблема
Я хочу добавить объектный файл в существующий двоичный файл. В качестве конкретного примера рассмотрим источник Hello.c
:
#include <stdlib.h>
int main(void)
{
return EXIT_SUCCESS;
}
Его можно скомпилировать в исполняемый файл с именем Hello
через gcc -std=gnu99 -Wall Hello.c -o Hello
. Кроме того, теперь рассмотрим Embed.c
:
func1(void)
{
}
Объектный файл Embed.o
можно создать из этого через gcc -c Embed.c
. Мой вопрос состоит в том, как вставить Embed.o
в Hello
таким образом, чтобы выполнялись необходимые перемещения, а соответствующие внутренние таблицы ELF (например, таблица символов, PLT и т.д.) Исправлены правильно?
Предположения
Можно предположить, что объектный файл, который должен быть встроен, уже имеет свои зависимости, статически связанные. Любые динамические зависимости, такие как среда выполнения C, могут считаться присутствующими также в целевом исполняемом файле.
Текущие попытки/идеи
- Используйте
libbfd
для копирования разделов из объектного файла в двоичный файл. Прогресс, который я сделал с этим, заключается в том, что я могу создать новый объект с разделами из исходного двоичного файла и разделами из объектного файла. Проблема заключается в том, что, поскольку объектный файл перемещается, его разделы не могут быть скопированы правильно на выход, не выполняя сначала перемещение. - Преобразуйте двоичный файл обратно в файл объекта и перейдите к
ld
. До сих пор я пытался использоватьobjcopy
для выполнения преобразованияobjcopy --input elf64-x86-64 --output elf64-x86-64 Hello Hello.o
. Очевидно, это не работает, поскольку я намерен, так какld -o Hello2 Embed.o Hello.o
приведет кld: error: Hello.o: unsupported ELF file type 2
. Думаю, этого следовало ожидать, так какHello
не является объектным файлом. - Найдите существующий инструмент, который выполняет такую вставку?
Обоснование (необязательное чтение)
Я создаю статический исполняемый редактор, где видение - позволить инструментарию произвольных пользовательских подпрограмм в существующий двоичный файл. Это будет работать в два этапа:
- Вставка объектного файла (содержащего пользовательские подпрограммы) в двоичный файл. Это обязательный шаг и не может быть обработан альтернативами, такими как инъекция общего объекта.
- Выполнение статического анализа в новом двоичном файле и использование этого для статической процедуры обхода от исходного кода к вновь добавленному коду.
У меня, по большей части, уже завершена работа, необходимая для шага 2, но у меня возникают проблемы с введением объектного файла. Проблема, безусловно, разрешима, учитывая, что другие инструменты используют один и тот же метод инъекции объекта (например, EEL).