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

此信息应包含在您已使用该-M选项生成的映射文件中。这会将其发送到默认映射文件。您可以使用类似-Map patches.map.

在映射文件中生成交叉引用表-cref也可能包含一些有用的信息。

于 2013-10-02T20:14:54.787 回答