5

コンパイルされた ELF ファイルでいくつかの変数を変更する必要があります。これを明確に説明するために、単純な C 構造体を例として使用します。

単一のソース ファイルがコンパイルされ、MyFile.c から MyFile.elf にリンク (@ 0x1000) されます。

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 でチェックサムを更新します。

最初の (1) タスクを実行するツール (objcopy など?) を見つけることができませんでした。これはかなり一般的なシナリオであると思われますか? 今のところ独自のツールを作成しましたが、オープン ソース ツールまたは類似のツールを使用したいと考えています。

提案/アイデア/コメント/批判は大歓迎です:D ありがとうございます!!

4

2 に答える 2

3

「gdb --write /your/application/binary」は、初期化されたデータの値を変更し、実行可能ファイルに書き戻すことができるはずです。

「-batch」と「-x command_file」を追加すると、必要なことができるようになります。

于 2013-11-11T06:00:06.803 に答える
2

QNX には、まさにこれを可能にする「spatch」と呼ばれる組み込みツールがあります。使用する他の提案gdbまたは 16 進エディターも同様に有効です。

バイナリ コードにパッチを適用することは完全に可能ですが、間違っているように思えます :-)。おそらく、これらの値は、バイナリと共に配布されるデータ ファイルに格納され、何らかのコンストラクターで読み込まれる方が適しているでしょうか? これをバイナリに含めることを要求するやむを得ない理由がない限り、私は真剣に設計を見て、本当にこれを行う必要があるかどうかを確認します。

あなたが思いついた答えが「はい、私は本当にこれを行う必要がある」であれば、それは素晴らしいことです. これを達成するために提案されたいくつかの非常に有効な方法があります。幸運を。

于 2013-11-11T06:15:21.863 に答える