[英]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.