通过研究系统提供的makefile,我们知道,其实还是使用gcc编译器来编译驱动的源码的。打开.hello.o.cmd文件,发现这样的信息:
gcc -Wp,-MD,/home/temp/.hello.o.d -nostdinc -iwithprefix include -D__KERNEL__ -Iinclude -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Os -fomit-frame-pointer -g -Wdeclaration-after-statement -pipe -msoft-float -m32 -fno-builtin-sprintf -fno-builtin-log2 -fno-builtin-puts -mpreferred-stack-boundary=2 -fno-unit-at-a-time -march=i686 -mregparm=3 -Iinclude/asm-i386/mach-generic -Iinclude/asm-i386/mach-default -DMODULE -DKBUILD_BASENAME=hello -DKBUILD_MODNAME=hello -c -o /home/temp/.tmp_hello.o /home/temp/hello.c
上面一长串就是编译驱动源码的参数。下面将逐个破译这些参数的含义:
1、头文件引用类:
1.1 参数中引用了如下头文件的目录:(注意,这些头文件的当前路径
是/lib/modules/2.6.9-42.ELsmp/build)
-Iinclude
-Iinclude/asm-i386/mach-generic
-Iinclude/asm-i386/mach-default
1.2 -nostdinc:这个指令告诉GCC不要包含libc等库的标准头文件
1.3 -iwithprefix include
使用include这个目录名作为第二包含路径,这里实际上没有用处,
因为没有使用 -iprefix来指定一个前缀
2、宏定义:
参数中定义了如下宏:
-D__KERNEL__
-DMODULE
-DKBUILD_BASENAME=hello
-DKBUILD_MODNAME=hello
3、警告选项:
-Wall 打开所有警告
-Wstrict-prototypes 如果函数的声明或定义没有指出参数类型,编译器就发出警告
-Wno-trigraphs 没找打这个参数的说明(直译是:不要“三字母一音”?)
-Wdeclaration-after-statement 在语句后面定义变量就会产生警告
Warn when a declaration is found after
a statement in a block.
4、优化选项:
-fno-builtin-sprintf
Optimize sprintf into strcpy if possible
-fno-builtin-log2 不使用内建的对数函数log2(n)
-fno-builtin-puts 不使用puts()函数
-fno-strict-aliasing 没找打这个参数的说明(直译是:不要使用严格的别名?)
-fno-common 即使未初始化的全局变量也分配在目标文件的bss段,
而不是把它们当做普通块(common block)建立.这样的结果是,
如果在两个不同的编译结果中声明了同一个变量(没使用extern ),
连接它们时会产生错误. 这个选项可能有用的唯一情况是,
你希望确认程序能在其他系统上运行,而其他系统总是这么做.
-fomit-frame-pointer 对于不需要帧指针(frame pointer)的函数,
不要在寄存器中保存帧指针.这样能够避免保存,设置和恢复
帧指针的指令;同时对许多函数提供一个额外的寄存器.
-fno-unit-at-a-time
-msoft-float 输出包含浮点库调用的目标码.
-m32 目标平台为32位,相对应的选项为-m64
-mpreferred-stack-boundary=2 没找打这个参数的说明
-march=i686 处理器架构
-mregparm=3 没找打这个参数的说明
5、基本选项:
5.1 -pipe 在编译过程的不同阶段间使用管道而非临时文件进行通信.
5.2 -g 产生调试信息
5.3 -c 编译,不链接
5.3 -o 指定输出文件
6、依赖文件:
-Wp,-MD,/home/temp/.hello.o.d 这一句是生成依赖文件的语法。
-MD这个选项在GCC文档中可以查到,-Wp这个选项查不到。
参数虽然多,无非也就是这六大类。看来,就算系统不提供makefile,我们也知道如何去编译驱动了,当然,系统提供的makefile还是非常好用。