insmod ko invalid module format [unknown relocation]


linux版本4.14 aarch32

用如下出錯版本的Makefile編譯basic.ko,insmod ko到kernel後提示invalid module format, dmesg查看內核打印信息 basic: unknown relocation: 10

出錯的版本
obj-m := basic.o
ARCH := arm 
CROSS_COMPILE := arm-linux-gnueabihf-
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
KDIR ?= ~/source-code/x1j/build/linux-xlnx-mirror

default:
    make -C $(KDIR) M=$(shell pwd) ARCH=$(ARCH)  modules 

OK的版本
obj-m := basic.o
ARCH := arm 
CROSS_COMPILE := arm-linux-gnueabihf-
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
KDIR ?= ~/source-code/x1j/build/linux-xlnx-mirror

default:
    make -C $(KDIR) M=$(shell pwd) ARCH=$(ARCH) CFLAGS_MODULE=-fno-pic modules 


OK的版本
obj-m := basic.o
export ARCH := arm 
export CROSS_COMPILE := arm-linux-gnueabihf-
#CC = $(CROSS_COMPILE)gcc
#LD = $(CROSS_COMPILE)ld
KDIR ?= ~/source-code/x1j/build/linux-xlnx-mirror

default:
    make -C $(KDIR) M=$(shell pwd) ARCH=$(ARCH) modules 

grep 打印信息可以查到是load_module加載ko時候對ko中的重定位段進行重定位時遇到無法處理的可重定位段時打印的錯誤信息

其中10 是define R_ARM_THM_CALL,且該define依賴的config  CONFIG_THUMB2_KERNEL是not set 狀態,確實對比如上的不同版本build出來的basic.ko 通過查看可重定位段的信息能看到,出錯的版本printk 這個符號是放在R_ARM_THM_CALL段中的

問題的原因就是kernel無法解釋R_ARM_THM_CALL這個段,CFLAGS_MODULE = -fno-pic 不編譯位置無關代碼自然避過了這個問題,爲什麼export 版本的makefile 編譯出來的ko就沒有這個段?

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章