如何将c代码编译成固件补丁并获取所有函数的位置?

如何将c代码编译成固件补丁并获取所有函数的位置?,c,assembly,linker,embedded,firmware,C,Assembly,Linker,Embedded,Firmware,我正在编译一些固件补丁。这些文件通常用C语言编写,然后修补到固件映像中,以更改硬件设备的行为。诀窍是,我将替换原始固件中的函数调用以分派到我的补丁程序,执行我的技巧,然后调用原始函数并最终返回 下面是一个简单的例子: __attribute__ ((section (".patches"))) void clean_memory() __attribute__ ((section (".patches"))); void clean_memory() { int *i; for (i

我正在编译一些固件补丁。这些文件通常用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
}
我真的很想自动化这个过程,而不是每次修改补丁时手动修补文件


如何获得patches.bin文件中每个函数所在的偏移量和长度列表?当我修补原始函数调用时,这一点很重要,因为偏移量将随着修补程序中每个函数的大小的更改而更改

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


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

在您使用
-M
标志生成的地图文件中,这些信息不是吗?为什么不能立即下载整个经过更正的固件?看起来您有一个gcc工具链,可能与binutils匹配,因此,您应该能够使用m68k rtems objdump提取此信息,可能使用-t选项,或者在从-d选项进行完全反汇编时解析此信息失败。embedded.kyle,我认为您得到了正确的答案。我没有意识到数据实际上在地图文件中。偏移量仍然是错误的,但我认为我可以编写一个简单的perl脚本来解析和纠正它们。
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