Инструмент для простой модификации файла elf? - PullRequest
6 голосов
/ 02 октября 2010

Мои встроенные проекты имеют шаг после обработки, который заменяет значение в исполняемом файле на CRC (некоторые разделы) флэш-памяти.Этот шаг может быть сделан только после связывания, так как это первая возможность CRC изображения.В прошлом формат файла был COFF, и я создал собственный инструмент для внесения исправлений.

Инструмент разработки перешел на ELF, поэтому мне нужно заново внедрить патчер CRC.Прежде чем сделать это, я подумал, что я буду искать существующий инструмент для этого.Компилятор основан на gcc, но я не вижу какой-либо комбинации ld и nm и readelf, которая может сделать эту работу.Поиск в Google не был плодотворным.

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

Я могу реализовать это с помощью libelf и пользовательского кода снова,но до того, как я это сделаю, он уже существует?

Есть ли лучший способ выполнить мою задачу - поместить CRC исполняемого файла в исполняемый файл, чтобы он был доступен для приложения?

Ответы [ 2 ]

4 голосов
/ 02 октября 2010

Если я понял, что вы пытаетесь сделать правильно, я думаю, что сработает следующее:

  • nm дает вам виртуальный адрес во время выполнения того места, которое вы хотите исправить;
  • readelf -S дает вам как виртуальный адрес времени выполнения, так и смещение в файле для начала каждого раздела;
  • Соединение двух вместе (например, с несколькими строками вашего любимого языка сценариев) дает смещение в файле для исправления.
0 голосов
/ 02 октября 2010

Я не уверен, что это сработает, но вы могли бы расположить его так, чтобы в качестве местоположения CRC в вашем объектном файле указывался адрес внешнего символа X . Затем этот внешний символ может быть удовлетворен последним этапом связывания путем связывания в файле эльфа, который ничего не делал, но указывает, что адрес X был CRC, который вы рассчитали.

Это все еще довольно глупо, и я не уверен, легко ли это выполнимо (так как это злоупотребление инструментами).

...