You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:45:34