编译模块时有几种编译方式
linux内核编译过程中选项为m的模块是单独编译的是对的,其软件的性能和质量都是不错的
❷ 如何编译/交叉编译内核模块, Linux 2.6.
椤�build 能够编译内核树目录内的内核模块,也能够编译内核树目录外的内核模块(外部内核模块)。. 编译外部内核模块的命令: #cd <your-mole-dir> #make -C <path-to-kernel> M=`pwd` 其中<your-mole-dir> 为要编译的内核模块所在目录,<path-to-kernel> 为内核源码所在的目录。 对于发行版本的Linux ,可以用: #make -C /lib/moles/`uname -r`/build M=`pwd` 注意:使用Kbuild 之前,必须先成功编译过内核源码。 说明: .#make -C <path-to-kernel> M=`pwd` moles 作用与上面的命令一样 .以前的内核版本可以使用 #make -C <path-to-kernel> SUBDIRS=`pwd` moles. 安装外部内核模块 #make -C <path-to-kernel> M=`pwd` moles_install 默认安装目录为:/lib/moles/`uname -r`/extra ,可以通过INSTALL_MOD_PATH 宏在默认安装路径前加前缀。 例如: #make -C <path-to-kernel> INSTALL_MOD_PATH=/opt M=`pwd` moles_install 则编译后的模块会放在/opt/lib/moles/`uname -r`/extra 通过宏INSTALL_MOD_DIR 可以修改是否放在'extra' 下,例如: #make -C <path-to-kernel> INSTALL_MOD_DIR=golf M=`pwd` moles_install 则编译后的模块会放在/lib/moles/`uname -r`/golf . 编译单个文件 #make -C <path-to-kernel> M=`pwd` <filename>. 其他命令 #make -C <path-to-kernel> M=`pwd` clean #make -C <path-to-kernel> M=`pwd` help.Kbuild 文件 Linux的Kbuild 会在内核模块目录下查找Kbuild 文件,如果有,则在编译时会使用该文件。示例: 假设有这么几个文件:8123_if.c 8123_if.h 8123_pci.c 8123_bin.o_shipped( 二进制的模块文件) Kbuild 文件的内容: obj-m := 8123.o 8123-y:8123_if.o 8123_pci.o 8123_bin.o Makefile的内容: #为了兼容旧版本的Kbuild ifneq($(KERNELRELEASE),) include Kbuildelse# 正常的Makefile KDIR:=/lib/moles/`uname -r`/buildall::$(MAKE) -C $(KDIR) M=`pwd` $@ # 其他targetgenbin:echo "X" > 8123_bin_shippedendif 注意,没有源码的二进制.o 文件必须以原文件名加_shipped 结尾,例如8123_bin.o_shipped,KBuild 会把8123_bin.o_shipped 复制为8123_bin.o ,然后一起编译。 应该用: ifeq ($(obj),) obj= .
❸ openwrt怎么编译自定义内核模块啊
开发环境为ubuntu.首先搭建编译环境。
sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term zlib1g-dev gawk asciidoc libz-dev git-core build-essential libssl-dev
下面就是下载源码,源码分两种,一种是最新版但不稳定,就是trunk版,一种是相对稳定版,
如果不是最新下载,最好定期更新代码,命令为
./scripts/feeds update –a
./scripts/feeds install –a
接着就是编译了。编译方法如下:
make defconfig
make menuconfig进入定制界面,选择自己的设备类型。
make V=99
下面就是增加内核模块的方法了
进入package目录,创建模块目录
cd backfire/package
mkdir example
进入example目录,创建Makefile文件和代码路径
cd example
touchMakefile
mkdir src
❹ 如何编译一个linux下的驱动模块
这是一个简单而完整的实例,对于理解Linux下的驱动模块是非常有帮助的。
1.源码如下:
/*
* hello.c -- the example of printf "hello world!" in the screen of driver program
*/
#include <linux/init.h>
#include <linux/mole.h>
MODULE_LICENSE("Dual BSD/GPL");/* declare the license of the mole ,it is necessary */
static int hello_init(void)
{
printk(KERN_ALERT "Hello World enter!\n");
return 0;
}
static int hello_exit(void)
{
printk(KERN_ALERT "Hello world exit!\n");
}
mole_init(hello_init); /* load the mole */
mole_exit(hello_exit); /* unload the mole */
进入目录:
[root@Alex_linux /]#cd /work/jiakun_test/moletest
[root@Alex_linux moletest]# vi hello.c
然后拷入上面书上的源码。
2.编译代码:
1>.首先我在2.4内核的虚拟机上进行编译,编译过程如下:
[root@Alex_linux moletest]#gcc -D__KERNEL__ -I /usr/src/linux -DMODULE -Wall -O2 -c -o hello.o hello.c
其中-I选项指定内河源码,也就是内核源码树路径。编译结果:
hello.c:1:22: net/sock.h: No such file or directory
hello.c: In function `hello_init':
hello.c:6: warning: implicit declaration of function `printk'
hello.c:6: `KERN_ALERT' undeclared (first use in this function)
hello.c:6: (Each undeclared identifier is reported only once
hello.c:6: for each function it appears in.)
hello.c:6: parse error before string constant
hello.c: In function `hello_exit':
hello.c:11: `KERN_ALERT' undeclared (first use in this function)
hello.c:11: parse error before string constant
hello.c: At top level:
hello.c:13: warning: type defaults to `int' in declaration of `mole_init'
hello.c:13: warning: parameter names (without types) in function declaration
hello.c:13: warning: data definition has no type or storage class
hello.c:14: warning: type defaults to `int' in declaration of `mole_exit'
hello.c:14: warning: parameter names (without types) in function declaration
hello.c:14: warning: data definition has no type or storage class
在网上查询有网友提示没有引入kernel.h
解决:vi hello.c
在第一行加入:#include <linux/kernel.h>
再次编译仍然报KERN_ALERT没有声明
修改编译条件-I,再次编译:
[root@Alex_linux moletest]#gcc -D__KERNEL__ -I /usr/src/linux -DMODULE -Wall -O2 -c -o hello.o hello.c
[root@Alex_linux moletest]#ls
hello.c hello.o Makefile
[root@Alex_linux moletest]#
2>.接着我尝试在2.6内核的虚拟机上进行编译
编译过程如下:
[root@JiaKun moletest]# ls
hello.c makefile
[root@JiaKun moletest]# vi hello.c
[root@JiaKun moletest]# make
make -C /mylinux/kernel/2.4.18-rmk7 M=/home/alex/test/moletest moles
make: *** /mylinux/kernel/2.4.18-rmk7: No such file or directory. Stop.
make: *** [moles] Error 2
[root@JiaKun moletest]# vi makefile
[root@JiaKun moletest]# make
make -C /usr/src/kernels/2.6.18-53.el5-i686 M=/home/alex/test/moletest moles
make[1]: Entering directory `/usr/src/kernels/2.6.18-53.el5-i686'
scripts/Makefile.build:17: /home/alex/test/moletest/Makefile: No such file or directory
make[2]: *** No rule to make target `/home/alex/test/moletest/Makefile'. Stop.
make[1]: *** [_mole_/home/alex/test/moletest] Error 2
make[1]: Leaving directory `/usr/src/kernels/2.6.18-53.el5-i686'
make: *** [moles] Error 2
[root@JiaKun moletest]# mv makefile Makefile
[root@JiaKun moletest]# make
make -C /usr/src/kernels/2.6.18-53.el5-i686 M=/home/alex/test/moletest moles
make[1]: Entering directory `/usr/src/kernels/2.6.18-53.el5-i686'
CC [M] /home/alex/test/moletest/hello.o
Building moles, stage 2.
MODPOST
CC /home/alex/test/moletest/hello.mod.o
LD [M] /home/alex/test/moletest/hello.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.18-53.el5-i686'
[root@JiaKun moletest]# ls
hello.c hello.ko hello.mod.c hello.mod.o hello.o Makefile Mole.symvers
3.执行代码,加载驱动模块:
2.4内核加载模块:
insmod ./hello.o
但是此时并没有输出printk打印的信息。但是可以在/var/log/messages 中看到打印的信息,这是由于KERN_ALERT优先级不够高。这里
需要修改为:KERN_EMERG。再次编译,加载模块即可以看到结果
2.6内核加载模块:
[root@JiaKun moletest]# insmod hello.ko
[root@JiaKun moletest]#
Message from syslogd@ at Sat Jul 26 19:52:44 2008 ...
JiaKun kernel: Hello, world
有的朋友可能会出现insmod命令找不到的错误,这可能有下面几个原因:
<1> 你的系统没有安装mole-init-tools工具,关于此问题,只需安装即可,但是一般装完系统是有这个命令的。
<2> 环境变量没有添加导致不能使用该命令。使用echo $PATH即可查看PATH环境变量,发现没有/sbin这个路径,所以你当然不能使用insmod这个命令了。解决的方法很简单,只需在命令行输入:
PATH = "$PATH:/sbin"即可添加。(insmod在/sbin这个目录下,你可以使用whereis insmod查看)。
<3> insmod这个命令需要在root权限下才能使用。
加载完成后你可以输入lsmod查看hello这个模块哦。
4.卸载驱动模块:rmmod hello.
加载模块后就可在屏幕上看到如下信息:Hello world enter.
卸载时就可在屏幕上看到如下信息:hello world exit.
[root@JiaKun moletest]# rmmod hello.ko
[root@JiaKun moletest]#
Message from syslogd@ at Sat Jul 26 19:52:58 2008 ...
JiaKun kernel: Goodbye, cruel world
另外,如果有多个文件,则按下列方式编写Makefile文件(file1.c、file2.c):
obj -m := molename.o
mole-objs := file1.o file2.o
❺ 易语言编译有三种,有什么区别
E语言编译反三种:普通编译、静态编译、编译成安装软件。普通编译:有时候会出现提示是否将文件写出到同一目录下。静态编译:直接编译成EXE可执行文件。编译成安装软件:直接编译成一个可安装的软件。
❻ 单片机c51有哪几种编译模式
下面仅对C51在变量定义中注意的问题以及与80C51存储资源有关的问题作说明,其余遵循C语言的规定。1.变量声明在变量的声明中,可以包括存储类型和signed或unsigned等属性。如:(1)chardatavar1;定义字符型变量var1,被分配在内部RAM低128B,编译后,通过直接寻址方式访问。(2)charcodetext[]=“ENTERPARAMETER”;定义字符数组text[],将其分配到程序存储区,并赋初始值“ENTERPARAMETER”。编译后,通过MOVCA,@A+DPTR访问。(3)unsignedlongxdataarray[100];定义无符号长整型数组array[100],将其分配到外RAM中,编译后,通过MOVXA,@DPTR访问。(4)floatidatax,y,z;定义浮点类型变量x,y,z,将其分配到内RAM中,编译后,通过间接寻址方式访问。(5)unsignedintpdatadimension;定义无符号整型变量dimension,将其分配到外RAM中,编译后,通过MOVXA,@Ri指令采用分页的形式访问。(6)unsignedcharxdatavector[10][4][4];定义无符号字符型数组vector[10][4][4],将其分配到外RAM中,编译后,通过MOVXA,@DPTR访问。(7)charbdataflags;定义字符型变量flags,将其分配到可位寻址的内部数据存储器中,可以以字节方式访问,也可以以位方式访问。