我正在aarch64机器上使用4.9 Linux内核,特别是 mm / memory.c 和自定义平台设备驱动程序。我的目标是让设备驱动程序将某些信息传达给硬件,这些硬件起源于 memory.c 中的功能。
起初,我尝试了与跨(平台)设备驱动程序进行通信相同的方法:
EXPORT_SYMBOL
用于驱动程序A中的各个功能通常像一个超级按钮一样工作,但是这次我在使用 extern 平台驱动程序 EXPORT 和memory.c
进行链接时遇到以下错误:
mm/memory.c:164:(.text+0x2a874): relocation truncated to fit: R_AARCH64_ADR_PREL_PG_HI21 against undefined symbol `my_func'
但是,如果我做相反的事情,那就是:
EXPORT_SYMBOL
中定义和memory.c
一个函数指针...有效!
特别是...
平台驱动程序:
void my_func(args){ ... };
EXPORT_SYMBOL(my_func);
memory.c:
extern void my_func(args);
...导致上述链接器错误。
但是...
平台驱动程序:
extern void (*funcptr)(args);
driver_probe() {
...
funcptr = &my_func;
....
}
memory.c:
void (*funcptr)(args) = NULL;
EXPORT_SYMBOL(funcptr);
...有效!
一个快速的Google搜索提示链接器错误与gcc选项PIC / PIE有关,但我找不到确切的答案。
现在可以使用...但是为什么呢? :-)