C语言 gcc:你能把函数指针放到不同的部分(不是.data)吗?



为了在主机上对嵌入式项目进行单元测试,我开始使用函数指针,以便能够在函数的"真实"实现和运行时的模拟之间进行切换。因此,我的函数'foo'在.c文件中看起来像这样:

// the 'real' implementation of the function to be used during runtime
void fooImplementation ( )
{
    /* ... */
}
// the function pointer, initialized to the 'real' implementation
void (*foo) ( ) = fooImplementation;

结果是目标处理器(Blackfin)产生一个异常,因为函数指针驻留在内部L1数据存储器中,该内存不允许携带代码,只允许携带数据。

一个有效的解决方案是为每个函数指针分配一个属性,这样它就会被放入不驻留在L1数据内存中的不同部分,例如:

void (*foo) ( ) __attribute__ (( section(".ext_mem"))) = fooImplementation;

但是这使得代码有点难以阅读并且容易出错(如果你忘记分配属性,单元测试可以正常运行,但是一旦在目标上调用函数,代码就会生成异常)。

所以我的问题是,如果有某种方法告诉gcc将所有函数指针默认放在不同的部分

默认情况下,在gcc中没有这样的选项来专门将所有函数指针放在特定的部分中。当然,除非你重写编译器和链接器的规则。

你必须使用__attribute__关键字,正如你在问题中提到的。如果代码看起来很复杂,可以围绕它创建一个宏:

#define SPECIAL_FOO(x) void (*x) ( ) __attribute__ (( section(".ext_mem"))) 

,然后这样使用:

SPECIAL_FOO(foo) = fooImplementation;

然而,还有另一种方法。您可以查看这个SO线程,以了解如何创建自定义链接器脚本来完成任务:(使用gcc)将某些编译器生成的变量强制放入特定的ELF节

最新更新