gpt4 book ai didi

c - 用函数 B 覆盖弱函数 A

转载 作者:太空狗 更新时间:2023-10-29 15:40:11 29 4
gpt4 key购买 nike

对于嵌入式设备,我有一个包含数组的文件,该数组带有存储中断处理程序的函数指针,这样定义(我无法修改它):

typedef void (*const ISRFunction)(void);

__attribute__((weak)) void ISR0(void){ for(;;); }
__attribute__((weak)) void ISR1(void){ for(;;); }
...
__attribute__((weak)) void ISR78(void){ for(;;); }
...

ISRFunction __vector_table[0x79] =
{
(ISRFunction)&ISR0,
(ISRFunction)&ISR1,
...
(ISRFunction)&ISR78,
...
}

我有第二个文件,它定义了一些我无法修改的函数。这个文件是这样的:

void blinkLed(void)
{ ... }

最后,我有一个主源文件,其中包含main 函数和设备配置。在中断 78 上,我想使 LED 闪烁。所以我写了一个像这样的强大函数 ISR78:

void ISR78(void)
{
blinkLed();
}

想知道有没有办法直接用blinkLed覆盖弱函数ISR78存储blinkLed的地址code> 在 __vector_table 中而不修改它或重命名函数?


编辑:

我实际上使用 GNU gcc 4.9.3 和关联的链接器 (GNU ld 2.24.0)。我可以修改与项目关联的 main.c 和 Makefile。

最佳答案

我看到实现你想要做的事情的唯一方法是用 ISR78 符号修补包含 blink 符号的目标文件的符号表。

objcopy [...] --redefine-sym blink=ISR78

应该这样做。然后,链接器应自动将前一个 blink 的地址插入到 vector 表中。显然,您的 blink 符号在那之后就消失了,不应该从其他地方调用。

但是,我认为这是一种 hack。

如果 _vector_table 是全局可访问的并且在可写内存中(不假设,这可能太简单了......),你可以简单地从你自己的代码中修补它

_vector_table [0x78] = blink;

在运行时。

关于c - 用函数 B 覆盖弱函数 A,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38695895/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com