繁体   English   中英

EXPORT_SYMBOL 导致在一个方向上未定义的引用,而不是另一个方向(重定位被截断)

[英]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 中的相应功能
  • 在驱动程序 B 中将符号定义为extern并访问

通常像魅力一样工作,但这次我在链接时遇到以下错误,平台驱动程序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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM