Проблема
Я хочу добавить объектный файл в существующий двоичный файл.В качестве конкретного примера рассмотрим источник 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 ).