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就沒有這個段?