陆陆续续也写了几个Linux内核模块了,但每次都是把代码写在一个源文件中,上次尝试了写在两个.c文件中,结果没有编译通过。 无奈之下,将其中一个.c文件重命名成.h文件,再include当另一个当中。但是,在.h文件中写函数的实现总感觉怪怪的。 今天查看了以下Kbuild的文档,有如下描述

[c-sharp] view plaincopy
  1. If a kernel module is built from several source files, you specify
  2. that you want to build a module in the same way as above.
  3. Kbuild needs to know which the parts that you want to build your
  4. module from, so you have to tell it by setting an
  5. $(<module_name>-objs) variable.
  6. Example:
  7. #drivers/isdn/i4l/Makefile
  8. obj-$(CONFIG_ISDN) += isdn.o
  9. isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o
  10. In this example, the module name will be isdn.o. Kbuild will
  11. compile the objects listed in $(isdn-objs) and then run
  12. "$(LD) -r" on the list of these files to generate isdn.o.

整理自己的源文件成两个.c文件(simpLB.c和sahu_lb_tools.c)、一个.h文件(sahu_lb.h)和Makefile文件。两个.c文件都包含了sahu_lb.h

按照Kbuild的文档所述,把Makefile改成如下内容:

[c-sharp] view plaincopy
  1. obj-m +=simpLB.o
  2. simpLB-objs:=sahu_lb_tools.o
  3. all:
  4. make -C /lib/modules/`uname -r`/build M=`pwd`
  5. clean:
  6. make -C /lib/modules/`uname -r`/build M=`pwd` clean
  7. install:
  8. /sbin/insmod simpLB.ko
  9. remove:
  10. /sbin/rmmod simpLB

编译没有问题,但是安装后模块的功能没有实现,就连我在init_module()中打印的提示信息都没有。lsmod却有simpLB。

只好再上网查了查,发现如下文章:

http://www.linuxquestions.org/questions/programming-9/linking-multiple-files-kernel-module-programming-701735/

按照文章的的建议,我把Makefile修改成如下内容:

[c-sharp] view plaincopy
  1. obj-m +=sahuLB.o
  2. sahuLB-objs:=simpLB.o sahu_lb_tools.o
  3. all:
  4. make -C /lib/modules/`uname -r`/build M=`pwd`
  5. clean:
  6. make -C /lib/modules/`uname -r`/build M=`pwd` clean
  7. install:
  8. /sbin/insmod sahuLB.ko
  9. remove:
  10. /sbin/rmmod sahuLB

如何将多个源文件编译为一个.ko相关推荐

  1. 编译内核模块生成ko驱动文件

    1.加载内核简介 Linux内核的整体架构本就非常庞大,其包含的组件也非常多.而我们怎样把需要的部分都包含在内核中呢?一种方法是把所有需要的功能都编译到Linux内核中.这会导致两个问题,一是生成的内 ...

  2. 运行单个源文件_使用一个命令执行单个Java源文件

    运行单个源文件 JDK增强提案 ( JEP ) 草案于2017年末创建,名为" 启动单文件源代码程序 "(其相关的JDK问题为JDK-8192920 ). 顾名思义,该JEP草案旨 ...

  3. java源文件编译成jar_从源文件和JAR文件构建Java代码模型

    java源文件编译成jar 最近,我花了一些时间来研究有效java ,该方法正在GitHub上达到300星(可以免费帮助实现目标:D). Effectivejava是在您的Java代码上运行查询的工具 ...

  4. python编译so_Mac上把python源文件编译成so文件

    把python源文件编译成so文件 前言 实际上属于一种代码混淆/加密的技术,大家知道python的源文件放在那里,大家是都可以看的,不像C语言编译出来可以拿编译后的东西去运行,所以就出现了这种需求. ...

  5. [重点!]头文件源文件编译链接

    [重点!]头文件&源文件&编译&链接 C/C++支持分离式编译:一个程序可以分成多个部分保存在各个文件(头文件.源文件)中,在链接之前,各个文件(无论源文件还是头文件)是相互独 ...

  6. python文件编译为so_Mac上把python源文件编译成so文件

    把python源文件编译成so文件 前言 实际上属于一种代码混淆/加密的技术,大家知道python的源文件放在那里,大家是都可以看的,不像C语言编译出来可以拿编译后的东西去运行,所以就出现了这种需求. ...

  7. Linux下静态编译的一个TIP

    Linux下静态编译的一个TIP | 素包子 Linux下静态编译的一个TIP 2010年3月28日 baoz 阅读评论 linux下静态编译好处很多,一来是可以跨发行版(debian redhat ...

  8. code ro rw zi 编译的一个ARM的程序,编译结果中的一句话

    code ro rw zi 编译的一个ARM的程序,编译结果中的一句话 Program Size: Code=8044 RO-data=52 RW-data=56 ZI-data=5184 其中: C ...

  9. 编译运行一个java程序_如何从另一个Java程序编译和运行Java程序

    编译运行一个java程序 Have you ever thought if it's possible to compile and run a java program from another j ...

最新文章

  1. 阿里云centos 6.5 32位安装可视化界面的方法
  2. 必须要熬夜的时候的最佳伴侣是什么?亲测有效
  3. wxWidgets:wxEventFilter类用法
  4. 云原生应用程序运行时 Kyma 简介
  5. oracle symonym_Oracle的同义词(synonyms)
  6. linux samba安装失败,用aptitude安装samba失败
  7. 怎么通过MQTT查看数据是否上云端_设备工程师们的福利来啦!JSON数据采集网关帮你实现云端对接~...
  8. 为什么你的年薪只是别人的月薪?你需要技术专家帮你「充电」
  9. H3C AP当无线路由器静态IP上网配置
  10. 论文笔记--用于人体姿势估计的深度双连续网络(Deep Dual Consecutive Network for Human Pose Estimation)
  11. Invalid bound statement (not found): com.zheng.mapper.UserMapper.login
  12. Android中的临时文件
  13. Yolov5进阶之一摄像头实时采集识别
  14. 弱网测试学习记录(1)
  15. 舰船知识科普-有图有真相(附PPT)
  16. 打地鼠小游戏 版本一
  17. Apache中间件漏洞深析
  18. 高校bbs或者科研论坛
  19. MySQL学习记录(11.9更新)
  20. 类似蘑菇街、迷尚的流瀑布图片展示Demo

热门文章

  1. 软件测试用例项目写作,通用测试用例写作方法
  2. laravel框架的数据库链接
  3. 产品管理:启示录 - 特约客户、产品验证、原型测试
  4. 【Immutable】拷贝与JSON.parse(JSON.stringify()),深度比较相等与underscore.isEqual(),性能比较...
  5. Redis实现之对象(三)
  6. Linux 普通用户拿到root权限及使用szrz命令上传下载文件
  7. python selenium T3
  8. coco2dx c++ HTTP实现
  9. HTML5 Canvas 高仿逼真 3D 布料图案效果
  10. IIS 7.0探索用于 Windows Vista 的 Web 服务器和更多内容