linux mak编译一个模块,hello内核模块编译的全过程

本文详细介绍了如何在Linux环境下编译一个简单的hello模块,包括编写源代码、配置Makefile、修改内核头文件、编译、安装、查看及卸载模块的全过程。关键步骤包括使用module_init和module_exit宏,以及通过$(MAKE)-C命令进行模块编译。
摘要由CSDN通过智能技术生成

hello内核模块编译的全过程

[日期:2011-02-25]

来源:Linux社区

作者:Linux

[字体:大 中 小]

Linux内核版本:2.6.10

在/home/tmp/下建立两个文件hello.c,Makefile

hello.c

------------

#include

#include

#include

MODULE_LICENSE("GPL");

static int hello_init(void)

{

printk(KERN_ALERT "hello module init\n");

return 0;

}

static void hello_exit(void)

{

printk(KERN_ALERT "hello module exit\n");

}

module_init(hello_init);

module_exit(hello_exit);

--------------

Makefile

----------

ifneq ($(KERNELRELEASE),)

obj-m := hello.o

else

KERNELDIR := /lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

default:

$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

endif

clean:

rm -f *.ko *.mod.c *.mod.o *.o

-----------

编译模块

#make

清除

#make clean

-----------

为了能够在终端显示信息,要修改

/lib/modules/2.6.10/build/include/linux/kernel.h

文件的KERN_ALERT宏。

#define KERN_ALERT "<1>"

修改为

#define KERN_ALERT "<0>"

------------

安装模块

#insmod hello.ko

终端显示

hello module init

查看已安装的模块

#lsmod

卸载模块

#rmmod hello

终端显示

hello module exit

-----------

有以下几点要注意:

1,hello.c文件中调用的头文件

init.h中的module_init(),module_exit()

kernel.h中的printk(),KERN_ALERT

module.h中的MODULE_LICENSE()

2,Makefile文件中的核心是

$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

1),-C $(KERNELDIR)

表示在$(KERNELDIR)目录下执行make命令。

2),M=$(PWD)

表示包含$(PWD)下的Makefile文件。

3),modules

表示模块编译。

4), 用到了ifneq...else...endif语句

由于开始还没定义KERNELRELEASE,所以只能执行else分支。

而在执行

$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

后,会在内核的Makefile中定义KERNELRELEASE,当进入本Makefile时,

则只会执行ifneq的第一个分支,即

obj-m := hello.o

这一句话是非常重要的。事实上,这个Makefile做的本份工作就是它。

我们也可以用命令行的方式来编译:

在Makefile中的内容写为:

obj-m := hello.o

然后在终端敲入:

#make -C /lib/modules/2.6.10/build M=/home/tmp modules0b1331709591d260c1c78e86d0c51c18.png

GNU libiconv-1.15和libintl-0.19.8.1,VS2017工程和 Makefile.mak 命令行编译文件 CSDN-tags: libiconv1.15 libintl-0.19.8.1 VS2017 SDK17134.12 声明: 最新版,修正了relocatable.c文件中GetModuleFileName函数的问题。在ANSI下,等同于:GetModuleFileNameA;Unicode下等同于:GetModuleFileNameW,如果你的程序出错,请检查。 代码为本人良心制作,虽然花费了一定的时间和精力,但不保证完全没有错误。如果您下载并使用了本代码,将其包含在您发布的应用中,给您带来了经济上,心理上,生活上的损失,本人不负有责任。 所有代码都基于官网进行修改,iconv的代码来源于libiconv-1.15的lib目录,intl的代码来源于gettext-runtime的intl目录。 intl需要iconv的支持,如果想单独编译不需要iconv的intl, 请自行修改intl目录下的config.h文件, /* Define if you have the iconv() function and it works. */ #define HAVE_ICONV 1 /* Define to 1 if you have the header file. */ #define HAVE_ICONV_H 1 为: /* Define if you have the iconv() function and it works. */ /* #undef HAVE_ICONV */ /* Define to 1 if you have the header file. */ /* #undef HAVE_ICONV_H */ 并修改VS工程中预处理器定义,删掉/DDEPENDS_ON_LIBICONV=1 VS的工程为VS2017的工程文件,使用VC141工具集,SDK10.0.17134.12,如果没有2017,也可以用Makefile.mak文件来编译。 或者你自己降低版本,我最初使用的最低版本是VC140_xp,SDK7.1A,也就是VS2015默认安装的兼容xp工具集,VS2015以下版本未测试。 nmake /f Makefile.mak [DLL] [DEBUG] 指定 DLL=1 编译dll版本,默认是lib版本,libiconv.lib , libintl.lib。 指定 DEBUG=1 编译debug版本,默认是release版本。 同理,如果intl不需要iconv,请修改上面的配置文件选项,并, 删掉Makefile.mak中/DDEPENDS_ON_LIBICONV=1 配置文件的制作,参考了以下几处,修改的大概原则是,能定义的全定义了,就这样: https://github.com/kahrl/gettext-msvc 这个地址提供了libiconv和libintl的VS工程和配置文件。 https://github.com/winlibs 为编译PHP而修改的libiconv和libintl源码。 附带的Cygwin目录中的工具 libiconv官方的制作文档,用cygwin配合VC,生成的配置文件。 一大堆的宏和函数搞得我头晕脑涨。所以配置文件如果有错误,也在所难免,所有修改的文件,如config.h,iconv.h,libintl.h都附带了原始文件。 如: 配置文件 原始文件 DLL原始文件 LIB原始文件 config.h config.h.in iconv.h iconv.h.build.in iconv.h.in localcharset.h localcharset.h.build.in localcharset.h.in libintl.h libgnuintl.in.h 欢迎同学们下载测试。有问题可以给我发邮件travel981cn@139.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值