簡體   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