Обновление объектного файла с использованием интерфейса BFD
Я должен добавить символ в существующий объектный файл. В настоящее время я пытаюсь с целью elf32-i386. Я попытался открыть объектный файл в режиме чтения / записи:
abfd = bfd_fopen ("test.o", "elf32-i386", "r+", -1);
У меня нет проблем с чтением существующей таблицы символов. Я сравнил это с выводом objdump, и это нормально. Но когда я добавляю новый символ в существующий список asymbol** и пытаюсь установить новую таблицу символов, вызывая `bfd_set_symtab(abfd, newsymtab, newsymtab_count), возвращается ошибка.
Глядя на файл syms.c, где bfd_set_symtab()
определяется, кажется, объект bfd, созданный в режиме "только для записи", может установить символ.
if (abfd->format != bfd_object || bfd_read_p (abfd))
{
bfd_set_error (bfd_error_invalid_operation);
return FALSE;
}
bfd_read_p (abfd) expands to :
((abfd)->direction == read_direction || (abfd)->direction == both_direction)
"+" режимы имеют оба_направления.
Я не могу открыть объектный файл в режиме записи, так как он уничтожит существующие данные в файле. У меня осталась единственная возможность скопировать объект BFD, созданный в режиме чтения, в другой, созданный в режиме записи нового файла выходных объектов. Посмотрел интерфейс BFD, и я не смог увидеть API для копирования / клонирования существующего объекта BFD. В документации BFD есть пример программы для создания таблицы символов, но она находится в новом выходном объектном файле. Я хочу обновить существующий объектный файл.
Может кто-нибудь сказать, как мы можем отредактировать объектный файл, используя интерфейс BFD для любого простого случая использования.
Большое спасибо!
1 ответ
Сам об этом понял. Я сослался на код утилиты objcopy. Функция copy_object() выполняет задачу, которую я хотел. Это делает много дополнительных вещей, основанных на опции командной строки. Мне пришлось выбросить все эти коды и сохранить только основные функции копирования, такие как настройка разделов, копирование таблицы символов, копирование перемещений, копирование содержимого раздела и личных данных. Я могу опубликовать код, если кто-то заинтересован.