加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用函数B覆盖弱函数A.

发布时间:2020-12-16 07:17:09 所属栏目:百科 来源:网络整理
导读:对于嵌入式设备,我的文件包含一个带有存储中断处理程序的函数指针的数组,这样定义(我不能修改它): typedef void (*const ISRFunction)(void);__attribute__((weak)) void ISR0(void){ for(;;); }__attribute__((weak)) void ISR1(void){ for(;;); }...__att
对于嵌入式设备,我的文件包含一个带有存储中断处理程序的函数指针的数组,这样定义(我不能修改它):

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)
{ ... }

最后,我有一个主要的源文件,主要功能和设备配置.在中断78,我想闪烁领导.所以我写了一个强大的功能ISR78:

void ISR78(void)
{
    blinkLed();
}

我想知道是否有一个解决方案直接通过blinkLed覆盖弱函数ISR78,即在__vector_table中存储blinkLed的地址而不修改它或重命名函数?

编辑:

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

解决方法

我看到实现您想要做的唯一方法是使用ISR78符号修补包含闪烁符号的目标文件的符号表.

objcopy […] –redefine-sym blink=ISR78

应该这样做.然后,链接器应自动将前一个闪烁的地址插入到向量表中.显然,你的眨眼符号在此之后消失了,不应该从其他地方调用.

但是,我会认为这是一个黑客.

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

_vector_table [0x78] = blink;

在运行时.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读