2

いくつかのファームウェア パッチをコンパイルしています。これらは通常 C で記述され、ハードウェア デバイスの動作を変更するためにファームウェア イメージにパッチが適用されます。トリックは、元のファームウェアの関数呼び出しを置き換えてパッチにディスパッチし、トリックを実行してから元の関数を呼び出し、最後に戻ることです。

以下に簡単な例を示します。

__attribute__ ((section (".patches")))

void clean_memory() __attribute__ ((section (".patches")));

void clean_memory() {
  int *i;
  for (i=(int *)0x80000;i<(int *)0x84000;i++)
    *(i)=0;
  asm("jsr      0x12345\n\t"); // call the original function
}

私は次のようにコンパイルしています:

m68k-rtems-gcc -mcpu32 -Wl,--section-start=.patches=0x31000 -O2 -c patches.c
m68k-rtems-ld -nostdlib --oformat=binary -M patches.o -o patches.bin

パッチを変更するたびに手動でファイルにパッチを適用するのではなく、このプロセスを自動化したいと考えています。

patch.bin ファイル内の各関数が存在するオフセットと長さのリストを取得するにはどうすればよいですか? これは、パッチ内のすべての関数のサイズが変更されるとオフセットが変更されるため、元の関数呼び出しにパッチを適用するときに重要です。

4

1 に答える 1

1

この情報は、オプションですでに生成している mapfile に含まれている必要があり-Mます。これにより、デフォルトのマップファイルに送信されます。などで独自に指定できます-Map patches.map

を使用して mapfile に相互参照テーブルを生成すると、-cref有用な情報が含まれる場合もあります。

于 2013-10-02T20:14:54.787 に答える