2013-11-10 3 views
3

Мне нужно изменить пару переменных в скомпилированном файле ELF. Попытка объяснить это ясно, я буду использовать простую C-структуру в качестве примера.Изменить значения переменных в файле ELF?

Исходный файл одного скомпилирован и связан (@ 0x1000) в MyFile.elf из MyFile.c:

typedef struct { 
    uint32_t SerialNumber;  /* Increments for every time it's programmed */ 
    uint32_t PartNumber;  /* Always the same */ 
    char  ProdDateTime[32]; /* "YYYY-MM-DD HH:MM:SS" date/time when programmed */ 
    uint32_t CalcCrc32;   /* Checksum of the above data */ 
} MyData_T; 

const MyData_T MyData = { 
    /* SerialNumber  */ 0x11111111, 
    /* PartNumber  */ 0x12345678, 
    /* ProdDateTime[32] */ "2013-11-10 12:49:30", 
    /* CalcCrc32   */ 0xC0CAC01A 
         }; 

Теперь мне нужна "консольное-инструмент", который (без компиляции):

  1. Записывает новый серийный номер 0x1000
  2. Пишет новую строку 0x1008
  3. Обновляет контрольной суммы в 0x1028.

Я не смог найти инструмент (objcopy и т. Д.?), Который даже выполняет первую задачу (1). Кажется, это должен быть довольно распространенный сценарий? На данный момент я написал свой собственный инструмент, но предпочел бы использовать инструмент с открытым исходным кодом или аналогичный.

Любые предложения/идеи/комментарии/критические замечания приветствуются: D Спасибо вам!

+1

У вас есть 'adb' (отладчик языка ассемблера, а не мотив android)? В тот же день мы сделали бы что-то вроде «echo» 0x1000? W 0x11111111 »| adb -w MyFile.elf' –

+0

Я не пробовал/не слышал о adb. Я не думаю, что у меня есть доступ к нему для моего проекта, но я буду смотреть на него независимо. Благодаря! – barnie82

+2

Необходимость корректировать скомпилированную двоичную систему не так распространена, как вы думаете. Как бы «универсальный» инструмент знал, где найти значения для изменения? В этом случае, если вам нужно сделать это на регулярной основе (1), писать пользовательскую утилиту - именно то, что я сделал бы. (1) Для одноразовых я просто использовал шестнадцатеричный редактор. – usr2564301

ответ

2

«gdb --write/your/application/binary» должен иметь возможность изменять значение инициализированных данных и записывать их обратно в исполняемый файл.

Добавить «-batch» и «-x command_file», и вы сможете заставить его делать то, что хотите.

+0

Я не пробовал, но несколько человек предложили gdb. Я программирую в среде WIN, и toolchain не был доставлен с помощью gdb, но, полагаю, я мог бы найти еще одну инструментальную цепочку для аналогичного процессора? Большое спасибо за вашу помощь :) – barnie82

+0

Какую инструментальную цепочку вы используете и какова цель (x86? ARM? Something else)? cygwin и mingw обе предоставляют предварительно скомпилированные двоичные файлы gdb, но это будет работать только для двоичных файлов. – ArtemB

+0

ARM, Freescale Kinetis K61, если быть более точным :) Я полагаю, что если я найду предварительно скомпилированный gdb для аналогичного процессора, я мог бы это использовать. Спасибо! – barnie82

1

QNX имеет встроенный инструмент под названием "spatch", который позволяет делать именно это. Остальные предложения по использованию gdb или шестнадцатеричный редактор одинаково действительны.

Хотя исправление двоичного кода вполне возможно, это звучит как , вы делаете это неправильно :-). Возможно, эти значения лучше подходят для хранения в каком-то файле данных, распространяемом вместе с двоичным кодом и считающемся во время какого-либо конструктора? Если у вас нет веских причин требовать, чтобы это было в двоичном формате, я бы серьезно посмотрел на дизайн и посмотрел, действительно ли вам нужно это сделать.

Если ответ, который вы придумали, это «да, мне действительно нужно это сделать», тогда здорово. У вас есть пара очень эффективных методов, предлагаемых для этого. Удачи.

+0

Спасибо за ваши идеи. Нет файловой системы и т. Д. Изображение, которое я редактирую, в основном составляет этот файл данных и запрограммировано прямо на вспышку (с использованием JTAG). – barnie82

+1

@ barnie82 Ah. Тогда вы не «делаете это неправильно», как я неправильно указал. Удачи. :-) – kmort

Смежные вопросы