いくつかのファームウェア パッチをコンパイルしています。これらは通常 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 ファイル内の各関数が存在するオフセットと長さのリストを取得するにはどうすればよいですか? これは、パッチ内のすべての関数のサイズが変更されるとオフセットが変更されるため、元の関数呼び出しにパッチを適用するときに重要です。