gpt4 book ai didi

c - EXPORT_SYMBOL 在一个方向上导致 undefined reference ,但在另一个方向上没有(重定位截断)

转载 作者:太空宇宙 更新时间:2023-11-03 23:38:00 51 4
gpt4 key购买 nike

我正在 aarch64 机器上开发 4.9 Linux 内核,特别是 mm/memory.c 和自定义平台设备驱动程序。我的目标是让我的设备驱动程序将一些信息传递给源自 memory.c 中函数的硬件。

起初,我尝试了我一直用于跨(平台)设备驱动程序通信的相同方法:

  • EXPORT_SYMBOL 用于驱动程序 A 中的相应函数
  • 在驱动B中定义符号为extern并访问

通常工作得很好,但这次我在链接时遇到以下错误,平台驱动程序 EXPORTing 和 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 有关,但我找不到明确的答案。

现在可以使用了……但是为什么? :-)

最佳答案

我认为给定的图片会澄清这里的错误。内核不能使用模块导出的符号。首先,内核不会构建给您所面临的链接器错误。

kernel symbol exporting knowledge

关于c - EXPORT_SYMBOL 在一个方向上导致 undefined reference ,但在另一个方向上没有(重定位截断),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53962128/

51 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com