[英]EXPORT_SYMBOL causes undefined reference in one direction, but not the other (relocation truncated)
我正在 aarch64 机器上处理 4.9 Linux 内核,特别是mm/memory.c和自定义平台设备驱动程序。 我的目标是让我的设备驱动程序将一些信息传递给源自memory.c中的函数的硬件。
起初,我尝试了我一直用于跨(平台)设备驱动程序通信的相同方法:
EXPORT_SYMBOL
用于驱动程序 A 中的相应功能通常像魅力一样工作,但这次我在链接时遇到以下错误,平台驱动程序EXPORT ing 和memory.c
使用extern :
mm/memory.c:164:(.text+0x2a874): relocation truncated to fit: R_AARCH64_ADR_PREL_PG_HI21 against undefined symbol `my_func'
但是,如果我做相反的事情,那就是:
memory.c
定义和EXPORT_SYMBOL
函数指针... 有用!
具体来说...
平台驱动:
void my_func(args){ ... };
EXPORT_SYMBOL(my_func);
内存.c:
extern void my_func(args);
...导致上述链接器错误。
但 ...
平台驱动:
extern void (*funcptr)(args);
driver_probe() {
...
funcptr = &my_func;
....
}
内存.c:
void (*funcptr)(args) = NULL;
EXPORT_SYMBOL(funcptr);
...工作!
快速谷歌搜索暗示链接器错误与 gcc 选项 PIC/PIE 有关,但我找不到明确的答案。
它现在有效......但为什么呢? :-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.