`
hududumo
  • 浏览: 242672 次
文章分类
社区版块
存档分类
最新评论

obj-y,obj-m 区别

 
阅读更多

目标定义是Kbuild Makefile的主要部分,也是核心部分。主要是定义了要编 译的文件,所有的选项,以及到哪些子目录去执行递归操作。

最简单的Kbuild makefile 只包含一行: 例子: obj-y += foo.o 该例子告诉Kbuild在这目录里,有一个名为foo.o的目标文件。foo.o将从foo.c 或foo.S文件编译得到。

如果foo.o要编译成一模块,那就要用obj-m了。所采用的形式如下: 例子: obj-$(CONFIG_FOO) += foo.o $(CONFIG_FOO)可以为y(编译进内核) 或m(编译成模块)。如果CONFIG_FOO不是y 和m,那么该文件就不会被编译联接了


Linux各级内核源代码的子目录下都有Makefile,大多数Makefile要嵌入主目录下的Rule.make,Rule.make将识别各个Makefile中所定义的一些变量。变量obj-y表示需要编绎到内核中的目标文件名集合,定义O_TARGET表示将obj-y连接为一个O_TARGET名称的目标文件,定义L_TARGET表示将obj-y合并为一个L_TARGET名称的库文件。同样obj-m表示需要编绎成模块的目标文件名集合。如果还需进行子目录make,则需要定义subdir-y和subdir-m。在Makefile中,用"obj-$(CONFIG_BINFMT_ELF)<wbr>+=<wbr>binfmt_elf.o"和"subdir-$(CONFIG_EXT2_FS)<wbr>+=<wbr>ext2"这种形式自动为obj-y、obj-m、subdir-y、subdir-m添加文件名。有时,情况没有这么单纯,还需要使用条件语句个别对待。Makefile中还有其它一些变量,如mod-subdirs定义了subdir-m以外的所有模块子目录。<wbr><br><br> Rules.make是如何使make进入子目录的呢?<wbr>先来看subdir-y是如何处理的,在Rules.make中,先对subdir-y中的每一个文件名加上前缀"_subdir_"再进行排序生成subdir-list集合,再以它作为目标集,对其中每一个目标产生一个子make,同时将目标名的前缀去掉得到子目录名,作为子make的起始目录参数。subdir-m与subdir-y类似,但情况稍微复杂一些。由于subdir-y中可能有模块定义,因此利用mod-subdirs变量将subdir-y中模块目录提取出来,再与subdir-m合成一个大的MOD_SUB_DIRS集合。subdir-m的目标所用的前缀是"_modsubdir_"。<wbr><br><br> 一点说明,子目录中的Makefile与Rules.make都没有嵌入.config文件,它是通过主Makefile向下传递MAKEFILES变量完成的。MAKEFILES是make自已识别的一个变量,在执行新的Makefile之前,make会首先加载MAKEFILES所指的文件。在主Makefile中它即指向.config。</wbr></wbr></wbr></wbr></wbr></wbr></wbr>
分享到:
评论

相关推荐

    内核态makefile指南

    当一个模块包含多个源文件时,例如`a.c`, `b.c`和`c.c`,可以在makefile中设置`obj-m += foo.o`,然后定义`foo-y := a.o b.o c.o`。这会告诉makefile,`foo.o`是由`a.o`, `b.o`和`c.o`生成的,这些对象文件随后会...

    Linux内核的Makefile1

    例如,`obj-y += foo.o`表示`foo.o`应被编译进内核,而`obj-$(CONFIG_FOO) += foo.o`则根据`CONFIG_FOO`的配置(y或m)决定是否编译`foo.o`。 4. 内置目标(3.2节)- `obj-y`: - `obj-y`列表中的文件将被编译成`...

    obj2mat.rar_.obj文件_obj_obj matlab_obj 转mat_obj格式文件

    `readObj_v_f.m` 可能负责解析`.obj`文件的内容,提取顶点和面的数据,而`obj2mat.m`则可能负责将这些数据组织成MATLAB的矩阵或结构体,并保存为`.mat`文件。 在MATLAB中,`.mat`文件是一种二进制文件格式,用于...

    Linux内核Makefile文件

    常见的有 `obj-y` 和 `obj-m`。 - **obj-y**:用于指示文件应被编译到最终内核镜像 `vmlinux` 中。 - 示例:`obj-y+=foo.o` - 解释:这行命令告诉 Make 工具将 `foo.o` 文件添加到最终的 `vmlinux` 镜像中。 - **...

    Linux内核配置文件之解读

    - **变量定义**:通过定义`obj-y`、`obj-m`、`subdir-y`、`subdir-m`等变量来指定哪些文件或子目录需要参与构建。 - **Rule.make的作用**:`Rule.make`文件位于顶层目录,负责识别这些变量,并根据定义执行相应的...

    里仁教育嵌入式linux内核编译基础

    `rules.make`文件中定义了几种不同的变量,包括`obj-y`、`obj-m`、`obj-n`和`obj-`。这些变量分别表示不同类型的文件集: - `obj-y`: 表示需要被编译并最终链接到内核中的目标文件。 - `obj-m`: 表示需要被编译为...

    KBuild MakeFile介绍.doc

    `可以是`y`或`m`,分别表示目标应编译进内核(`y`)还是作为模块(`m`)。例如,`obj-y += foo.o`将foo.o编译进内核。 - `xxx-objs`:如果源文件不止一个,可以通过此变量指定编译对象所需的源文件列表,如`foo-objs :=...

    Linux内核Makefile文件.doc

    obj-y 是 Makefile 文件中用于定义内嵌对象的关键字。 3.3 可加载模块 - obj-m 可加载模块是指可以在运行时动态加载的内核模块。obj-m 是 Makefile 文件中用于定义可加载模块的关键字。 3.4 导出符号目标 导出符号...

    linux2.6内核Makefile详解

    - **obj-y 变量**:用于指定需要编译的对象文件,这些文件将被链接到最终的 vmlinux 镜像中。例如: ```makefile obj-y += foo.o ``` 这条指令表示 foo.o 将作为内置对象编译进 vmlinux。 - **obj-m 变量**...

    vs运行matlab代码-Physically-based-Sound:基于物理的声音

    vs运行matlab代码 Physically-based-Sound 环境搭建 预处理 该部分代码参考项目 ...-y 3.5E+9 -p 0.34 -m -k -g -s -d 1 | tee -a 'precalc.log' # obj-1为模型名称,所在路径下应有obj-1.obj,obj-1.

    linux内核makefile.pdf

    这里`$(CONFIG_FOO)`可以是`y`(内置对象)或`m`(模块对象)。如果`CONFIG_FOO`不是`y`或`m`,则该文件不会被编译或链接。 **3.2 内嵌对象-obj-y**:这些目标文件会被编译并最终链接到`vmlinux`中。这些文件按照...

    linux内核kbuild Makefile详解

    它使用`$(obj-y)`、`$(obj-m)`等变量来收集目标文件,并通过`$(ccflags-y)`、`$(ldflags-y)`等变量设置编译和链接选项。 6. **目标规则**:每个`Makefile`中的规则定义了如何从源文件生成目标文件。例如,`obj-%.o:...

    Kernel Makefile

    - **Loadable Module(obj-m)**:可加载模块,编译为单独的模块文件,可以在运行时加载或卸载。 - **Library(lib-y)**:库文件,供其他模块或内核组件使用。 ### 递归编译与编译标志 - **ccflags-y**:C编译器...

    Linux内核的Makefile2

    `obj-y`列表中的文件会被编译并链接到`vmlinux`,顺序很重要,因为它影响到如module_init()和__initcall等初始化函数的调用顺序。例如,在SCSI控制器的检测中,顺序可能会影响磁盘的编号。 在`drivers/isdn/i4l/...

    linux内核的makefile规则文.pdf

    - **目标定义**:定义编译的目标,如内核(`vmlinux`)和模块(`obj-m`)。 - **编译进内核(obj-y)**:指定哪些文件需要编译进内核。 - **编译可装载模块(obj-m)**:用于构建外部加载的模块。 - **输出的符号(obj-x)**:...

Global site tag (gtag.js) - Google Analytics