我正在编译一些固件补丁这些通常用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文件中存在?这在修补原始函数调用时很重要,因为修补程序中每个函数的大小都会改变偏移量
最佳答案
此信息应包含在已使用-M
选项生成的映射文件中这会将其发送到默认映射文件您可以使用类似-Map patches.map
的内容指定自己的。
在带有-cref
的映射文件中生成交叉引用表也可能包含一些有用的信息。