Chinaunix首页 | 论坛 | 博客
  • 博客访问: 262302
  • 博文数量: 49
  • 博客积分: 1684
  • 博客等级: 上尉
  • 技术积分: 458
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-09 22:45
文章分类

全部博文(49)

文章存档

2023年(1)

2021年(2)

2018年(2)

2017年(7)

2016年(2)

2015年(6)

2014年(13)

2013年(7)

2012年(7)

2011年(1)

2010年(1)

分类: LINUX

2013-03-17 00:47:39

Linux驱动开发学习笔记(3):用GCC编译驱动的时候,命令行参数的含义

       通过研究系统提供的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还是非常好用。
阅读(2948) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~