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段中的

insmod ko invalid module format [unknown relocation]_第1张图片

insmod ko invalid module format [unknown relocation]_第2张图片

insmod ko invalid module format [unknown relocation]_第3张图片

问题的原因就是kernel无法解释R_ARM_THM_CALL这个段,CFLAGS_MODULE = -fno-pic 不编译位置无关代码自然避过了这个问题,为什么export 版本的makefile 编译出来的ko就没有这个段?

 

 

你可能感兴趣的:(ARM,LINUX,编译原理)