编译"hello world"驱动后都生成了什么
2011-11-03 09:20
447 查看
虽然系统提供的makefile很智能地将hello.c最终编译成了hello.ko,但是我还是想知道系统的makefile到底干了些什么。
首先看编译驱动的目录,编译后多个四个文件:hello.ko, hello.mod.c, hello.mod.o, hello.o
hello.mod.c是一个C程序的源文件,查看其内容,似乎仅仅只是定义了两个全局的结构体变量。
我猜想:这个文件其实是驱动的版本信息,编译后的这些信息就好像元数据一样附加到ELF文件的.TEXT段,然后加载驱动的框架可以读取这些信息。原理应该是WINDOWS下的那种rc文件一样。
光看生成的文件还不够,修改了一下Makefile,把具体的执行信息都打印出来:
obj-m := hello.o
KERNEL_DIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules -n
clean:
rm *.o *.ko
在调用系统提供的makefile的时候,加上-n的参数。-n是指执行命令的时候将命令打印出来,但并不真正的执行。
修改好后执行make,果然打印了许许多多的命令出来。认真看产生的命令,发现居然在源码目录下创建了一个隐藏文件,有意思,于是执行:ll -a,将所有文件显示出来:
编译驱动后,不仅仅只多了四个文件,其实还产生了一个隐藏目录(.tmp_versions)和三个隐藏的文本文件(.hello.ko.cmd, .hello.mod.o.cmd, .hello.o.cmd)。
查看三个隐藏文件的内容,终于明白了系统的makefile执行的流程:
1、建立隐藏文件夹.tmp_versions,作为编译过程中的临时文件夹;
2、使用GCC编译hello.c,生成hello.o,将编译的命令参数行写到 .hello.o.cmd
3、使用脚本程序,根据hello.c生成hello.mod.c,hello.mod.c其实是驱动需要的元数据;
4、使用GCC编译hello.mod.c,生成hello.mod.o,将编译的命令参数行写到 .hello.mod.o
5、使用ld链接器链接hello.mod.o和hello.o,生成hello.ko,将命令参数行写到.hello.ko.cmd
6、删除中间生成的临时文件
原文地址:http://hi.baidu.com/ah__fu/blog/item/0f53ff4c2a5ecaf1d62afc62.html
参考文档 http://www.360doc.com/content/11/0404/16/1317564_107153582.shtml
首先看编译驱动的目录,编译后多个四个文件:hello.ko, hello.mod.c, hello.mod.o, hello.o
hello.mod.c是一个C程序的源文件,查看其内容,似乎仅仅只是定义了两个全局的结构体变量。
我猜想:这个文件其实是驱动的版本信息,编译后的这些信息就好像元数据一样附加到ELF文件的.TEXT段,然后加载驱动的框架可以读取这些信息。原理应该是WINDOWS下的那种rc文件一样。
光看生成的文件还不够,修改了一下Makefile,把具体的执行信息都打印出来:
obj-m := hello.o
KERNEL_DIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules -n
clean:
rm *.o *.ko
在调用系统提供的makefile的时候,加上-n的参数。-n是指执行命令的时候将命令打印出来,但并不真正的执行。
修改好后执行make,果然打印了许许多多的命令出来。认真看产生的命令,发现居然在源码目录下创建了一个隐藏文件,有意思,于是执行:ll -a,将所有文件显示出来:
编译驱动后,不仅仅只多了四个文件,其实还产生了一个隐藏目录(.tmp_versions)和三个隐藏的文本文件(.hello.ko.cmd, .hello.mod.o.cmd, .hello.o.cmd)。
查看三个隐藏文件的内容,终于明白了系统的makefile执行的流程:
1、建立隐藏文件夹.tmp_versions,作为编译过程中的临时文件夹;
2、使用GCC编译hello.c,生成hello.o,将编译的命令参数行写到 .hello.o.cmd
3、使用脚本程序,根据hello.c生成hello.mod.c,hello.mod.c其实是驱动需要的元数据;
4、使用GCC编译hello.mod.c,生成hello.mod.o,将编译的命令参数行写到 .hello.mod.o
5、使用ld链接器链接hello.mod.o和hello.o,生成hello.ko,将命令参数行写到.hello.ko.cmd
6、删除中间生成的临时文件
原文地址:http://hi.baidu.com/ah__fu/blog/item/0f53ff4c2a5ecaf1d62afc62.html
参考文档 http://www.360doc.com/content/11/0404/16/1317564_107153582.shtml
相关文章推荐
- 字符设备驱动之"Hello, World!"
- Linux 下 Makefile 的 automake 生成举例 "hello world"
- "Hello World " —— 深入理解程序从编译到运行
- BASH脚本(ok2makefile):生成带有makefile的C++ "Hello world"程序
- (除了一个msgbox什么也没有) directshow之"hello world"第二步收藏
- "Hello World " —— 深入理解程序从编译到执行
- (除了一个msgbox什么也没有) directshow之"hello world"第二步
- 结合"hello world"探讨gcc编译程序的过程
- (void)printf("hello world"); int a=2; void(a);中的(void)有什么用?
- 结合"hello world"探讨gcc编译程序的过程
- "Hello world" Driver Build
- 使用 NetBeans 开发 Java EE 5 "Hello World"
- 自己动手写操作系统--"Hello, OS world!"
- MOD 之"Hello World"
- Linux Assembly "Hello World" Tutorial, CS 200
- 在Java程序中调用C函数--打印"HelloWorld"
- hello world"你知多少------300种编程语言中的"hello world"程序汇
- char *myString = "Hello-World!";和 char myString[] = "Hello-World!";
- .Linux设备驱动程序学习(0)——设备驱动介绍& Hello, world!模块 内核参数传递
- 第一个驱动helloworld module加载i…