BeagleBone双EXPORT_SYMBOL相关模块编译部署疑问
BeagleBone多模块驱动开发疑问解答
背景代码
gpio_module.c
uint8_t GPIO_device(void) {} EXPORT_SYMBOL(GPIO_device);
BBG_module.c
extern uint8_t GPIO_device(void); GPIO_device();
当前Makefile
obj-m := gpio-module.o BBG_module.o ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- KERNELDIR=/usr/src/kernels/linux-4.9.82-ti-r102 arm_modules: $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNELDIR) M=$(shell pwd) modules KBUILD_EXTRA_SYMBOLS=`pwd`/dep/Module.symvers echo "building module for arm architecture:"
疑问解答
1. 是否需将Module.symvers同步到BeagleBone设备?
不需要。Module.symvers是编译阶段的辅助文件,仅用来记录导出符号的CRC校验值、地址等信息,保证编译时跨模块符号引用的一致性。设备端只需要加载最终生成的.ko文件即可,这个文件完全不需要拷贝到设备上。
2. 是否需在Makefile中添加其他配置,以及KBUILD_EXTRA_SYMBOLS参数是否必要?
KBUILD_EXTRA_SYMBOLS的必要性
- 如果你是同时编译两个模块(当前Makefile中
obj-m同时包含两个模块),这个参数完全没必要。内核构建系统会自动在当前编译目录生成统一的Module.symvers,可以直接处理模块间的符号依赖。 - 如果你是分开编译两个模块(比如先单独编译gpio_module,之后再编译BBG_module),这个参数就必须配置——它的作用是告诉内核构建系统去哪里找gpio_module导出的符号信息,否则编译BBG_module时会出现
undefined reference to GPIO_device的链接错误。
Makefile额外配置建议
- 添加
clean目标,方便快速清理编译产物:clean: $(MAKE) -C $(KERNELDIR) M=$(shell pwd) clean - 修正当前Makefile里的拼写错误:把
bulding改成building - 如果是分开编译场景,要确保
KBUILD_EXTRA_SYMBOLS指向正确的Module.symvers路径(比如gpio_module编译完成后生成的该文件所在位置)
内容的提问来源于stack exchange,提问作者Yael
相关产品推荐
相关产品推荐

