博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux 内核中的Makefile
阅读量:2344 次
发布时间:2019-05-10

本文共 8642 字,大约阅读时间需要 28 分钟。

init-y          := $(patsubst %/, %/built-in.o, $(init-y)) ## 表示将$(init-y)列表中"/"替换为"/built-in.o",也就是最终init-y == init/built-in.o
include $(srctree)/arch/$(SRCARCH)/Makefile
vmlinux映像生成的一般规则综述通过以上分析路径all --> vmlinux --> $(vmlinux-lds) $(vmlinux-init) --> $(head-y) $(init-y) -- --> built-in.o head32.o head_32.o init_task.o --> *.c *.S

$@ 表示目标文件

$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表

% 仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是“foo.a(bar.o)”,那么,“ %”就是“bar.o”,“$@”就是“foo.a”。如果目标不是函数库文件(Unix下是[.a],Windows下是[.lib]),那么,其值为空。

+ 这 个 变 量 很 像 “ + 这个变量很像“ +^”,也是所有依赖目标的集合。只是它不去除重复的依赖目标。

∗ 这 个 变 量 表 示 目 标 模 式 中 “ * 这个变量表示目标模式中“%”及其之前的部分。如果目标是“dir/a.foo.b”,并且目标的模式是“a.%.b”,那么,“ ”的值就是“dir/a.foo”。这个变量对于构造有关联的文件名是比较有较。如果目标中没有模式的定义,那么“ ∗ ” 也 就 不 能 被 推 导 出 , 但 是 , 如 果 目 标 文 件 的 后 缀 是 m a k e 所 识 别 的 , 那 么 “ *”也就不能被推导出,但是,如果目标文件的后缀是make所识别的,那么“ make”就是除了后缀的那一部分。例如:如果目标是“foo.c”,因为“.c”是make所能识别的后缀名,所以,“ ∗ ” 的 值 就 是 “ f o o ” 。 这 个 特 性 是 G N U m a k e 的 , 很 有 可 能 不 兼 容 于 其 它 版 本 的 m a k e , 所 以 , 你 应 该 尽 量 避 免 使 用 “ *”的值就是“foo”。这个特性是GNU make的,很有可能不兼容于其它版本的make,所以,你应该尽量避免使用“ fooGNUmakemake使”,除非是在隐含规则或是静态模式中。如果目标中的后缀是make所不能识别的,那么“$”就是空值。

' $ '符号的使用          美元符号$,主要扩展打开makefile中定义的变量 ' $$ '符号的使用          $$ 符号主要扩展打开makefile中定义的shell变量

1、wildcard : 扩展通配符

2、notdir : 去除路径
3、patsubst :替换通配符

.PHONY: all cleanMAKE = mingw32-makeMKDIR = mkdirRM = rmRMFLAGS = -frCC = gccDIR_OBJS = objsDIR_EXES = exesDIR_DEPS = depsDIRS = $(DIR_OBJS) $(DIR_EXES) $(DIR_DEPS)EXE = complicated.exe                  #最终可执行文件EXE := $(addprefix $(DIR_EXES)/, $(EXE))SRCS = $(wildcard *.c)OBJS = $(SRCS:.c=.o)               #中间编译文件OBJS := $(addprefix $(DIR_OBJS)/, $(OBJS))DEPS = $(SRCS:.c=.dep)DEPS := $(addprefix $(DIR_DEPS)/, $(DEPS))all: $(DIRS) $(DEPS) $(EXE)           #指定编译顺序$(DIRS):	$(MKDIR) $@$(EXE): $(OBJS)	$(CC) -o $@ $^$(DIR_OBJS)/%.o: %.c	$(CC) -o $@ -c $^$(DIR_DEPS)/%.dep: %.c	@echo "Creating $@ ..."	@set -e;\	$(RM) $(RMFLAGS) $@.tmp ;\	$(CC) -E -MM $^ > $@.tmp ;\	sed 's,\(.*\)\.o[ :]*,objs/\1.o: ,g' < $@.tmp > $@ ;\	$(RM) $(RMFLAGS) $@.tmpclean:	$(RM) $(RMFLAGS) $(DIRS)

lsm_dem

目录名 包含文件 Makefile内容
cmd qax-ctl.c qax-manger.c Makefile
config policies.db rules.db Makefile
include audit.h ctl.h lib.h list.h policy.h rules.h
lib lib_config.c lib_config.h lib_ctl.c lib_ctl.h lib_policy.c lib_policy.h lib_ruels.c lib_ruels.h lib_sqlite.c lib_sqlite.h Makefile sqlite3.c sqlite3.h
mod audit.c avc.c common.h file.c hooks.c kernel_symbols.h lsm_prc.c policy.c pr.c qaxfs.c rules.c task.c Makefile
test uc_01/ uc_02/ uc_03/ uc_04/ uc_0/5 uc_06/ Makefile
./ Makefile
  • cmd

    • Makefile
CMDS=qax-manager qax-ctlCFLAGS=-I../include/LIB_DIR=../libLIBS=\	$(LIB_DIR)/lib_rules.a \	$(LIB_DIR)/lib_ctl.a \	$(LIB_DIR)/lib_policy.a \	$(LIB_DIR)/lib_sqlite.a \	$(LIB_DIR)/lib_config.a \	$(LIB_DIR)/sqlite3.aAPP_LIBS=-lpthread -ldl%: %.c	gcc $(CFLAGS) -o $@ $<   $(LIBS)  $(APP_LIBS)all: $(CMDS)clean:	rm -rf $(CMDS)install:	install  -m 777 -d $(INS_DIR)/cmd	install  -m 555 -D  qax-manager $(INS_DIR)/cmd	install  -m 555 -D  qax-ctl $(INS_DIR)/cmd
  • config

    • Makefile
all: clean:install:	install  -m 777 -d $(INS_DIR)/config	install  -m 666 -D  rules.db $(INS_DIR)/config	install  -m 666 -D  policies.db $(INS_DIR)/config
  • lib

    • Makefile
LIBS=lib_qax_ctl.a lib_qax_rules.a lib_qax_policy.a lib_qax_sqlite.a lib_qax_config.a sqlite3.a# INC_CFLAGS=-I../include/APP_LIBS=-lpthread -ldl%.o: %.c	gcc -c $(INC_CFLAGS) -o $@ $*.c#lib_qax_sqlite.a: lib_qax_sqlite.o sqlite3.o#	ar -r $@ $?#lib_qax_policy.a: lib_qax_policy.o#	ar -r $@ $?%.a: %.o	ar -r $@ $
  • mod

    • Makefile
PWD := $(shell pwd)KDIR := /lib/modules/$(shell uname -r)/build ccflags-y = -I$(src)/../includeobj-m := qax_lsm_demo.o qax_lsm_demo-objs := hooks.o audit.o task.o qaxfs.o policy.o pr.o rules.o file.o avc.odefault: header_files	echo $(EXTRA_CFLAGS)	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) moduleshooks.o: $(PWD)/../include/qax_policy.hclean: 	echo $(PWD)/../include 	rm -rf *.o core mklog Module.symvers Module.markers	rm -rf kernel_symbols.h	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) cleaninstall:	install  -m 777 -d $(INS_DIR)/mod	install  -m 555 -D  qax_lsm_demo.ko $(INS_DIR)/modload: qax_lsm_demo.ko	insmod qax_lsm_demo.ko unload:	rmmod qax_lsm_demo.koall:  defaultheader_files:	@(SYM=`grep security_hook_heads /proc/kallsyms |  awk "{print \\$$1}"`;\	echo "#define SYM_ADDR_security_hook_heads 0x$$SYM" > kernel_symbols.h)
  • test

    • Makefile
all:	gcc -o uc_04/file_read   uc_04/file_read.c	gcc -o uc_04/file_write  uc_04/file_write.c	@(cd uc_01; make; )install:	install  -m 777 -d $(INS_DIR)/test	install  -m 777 -d $(INS_DIR)/test/uc_01	install  -m 555 -D  uc_01/hello_mod.ko $(INS_DIR)/test/uc_01	install  -m 777 -d $(INS_DIR)/test/uc_02	install  -m 777 -D  uc_02/prep.sh $(INS_DIR)/test/uc_02	install  -m 777 -D  uc_02/run.sh $(INS_DIR)/test/uc_02	install  -m 777 -d $(INS_DIR)/test/uc_03	install  -m 777 -D  uc_03/prep.sh $(INS_DIR)/test/uc_03	install  -m 777 -D  uc_03/run.sh $(INS_DIR)/test/uc_03	install  -m 777 -d $(INS_DIR)/test/uc_04	install  -m 777 -D  uc_04/prep.sh $(INS_DIR)/test/uc_04	install  -m 777 -D  uc_04/run.sh $(INS_DIR)/test/uc_04	install  -m 777 -D  uc_04/file_read $(INS_DIR)/test/uc_04	install  -m 777 -D  uc_04/file_write $(INS_DIR)/test/uc_04	install  -m 777 -d $(INS_DIR)/test/uc_05	install  -m 777 -D  uc_05/uc05_test.sh $(INS_DIR)/test/uc_05	install  -m 777 -d $(INS_DIR)/test/uc_06	install  -m 777 -D  uc_06/prep.sh $(INS_DIR)/test/uc_06	install  -m 777 -D  uc_06/run.sh $(INS_DIR)/test/uc_06clean:	rm -rf uc_04/file_read uc_04/file_write	@(cd uc_01; make clean; )
  • Makefile

PWD=$(shell pwd)SUBDIRS=lib cmd mod config testINS_DIR=$(PWD)/outputall:	@(for SUBDIR in $(SUBDIRS);					\	do							\	    cd $(PWD)/$$SUBDIR; make all;			\	done)install:	install  -m 777 -d $(INS_DIR)	@(for SUBDIR in $(SUBDIRS);					\	do							\		cd $(PWD)/$$SUBDIR; make install INS_DIR=$(INS_DIR); \	done)clean:	@(for SUBDIR in $(SUBDIRS);					\	do							\	    cd $(PWD)/$$SUBDIR; make clean;			\	done)

我这里自己写了个,遍历kenel 文件夹,生成对应的.o文件:

├── boot├── fs├── include├── init│   ├── main.c│   └── main.o├── kernel│   ├── asm.s│   ├── blk_drv│   ├── exit.c│   ├── fork.c│   ├── Makefile│   ├── math│   ├── mktime.c│   ├── mktime.o│   ├── panic.c│   ├── panic.o│   ├── printk.c│   ├── printk.o│   ├── sched.c│   ├── signal.c│   ├── sys.c│   ├── sys_call.s│   ├── traps.c│   └── vsprintf.c├── lib├── Rules.make└── tools    └── build.c
CC = gccDIR_KER = kernelSRC = $(wildcard *.c)OBJS = $(SRC:.c = .o)KER_FILES = $(foreach dir,$(DIR_KER),$(wildcard $(DIR_KER)/*.c))KER_OBJS = $(patsubst %.c,%.o, $(KER_FILES))all: init/main.o $(KER_OBJS) mainCFLAGS = -wmain:init/main.o kernel/mktime.o	echo $(KER_OBJS)	$(CC) $(CFLAGS) -o $@ $^init/main.o : init/main.c 	$(CC) $(CFLAGS) -o $@ -c $^ -I ./include$(KER_OBJS):%.o: %.c	$(CC) $(CFLAGS) -o $@ -c $^ -I ./includeclean:	rm -f Image System.map tmp_make core boot/bootsect boot/setup \		boot/bootsect.s boot/setup.s	rm -f init/*.o tools/system tools/build boot/*.o	(cd mm;make clean)	(cd fs;make clean)	(cd kernel;make clean)	(cd lib;make clean)
#CONFIG_ECAT_DRV为m时编译为模块,为y时编进内核  PWD := $(shell pwd) #生成模块文件和其中间文件obj-m += syshook.o  #-objs指定依赖的多个.o文件  syshook-objs := stack/dumpstack.o main.occflags-y += -I$(src)/includeKERNELDIR = /lib/modules/$(shell uname -r)/build all:  	echo $(PWD)	make -C  $(KERNELDIR) M=$(PWD) modules  clean:  	rm *.o *.ko *~ *.mod.c *.order *.symvers

CmakeLists.txt 联合Makefile

目录 文件
core CMakeLists/Makefile /module.c
inc linux// CMakeLists.txt/Makefile
other CMakeList/Makefile
kclib linux//CMakeLists.txt/atomic.c dump_data.c/CMakeLists.txt/

CMakeLists.txt

add_subdirectory(pub)add_subdirectory(inc)add_subdirectory(kclib)add_subdirectory(core)

core/CMakeLists

set( QAX_KMOD_NAME 	fccore)set( KMOD_OBJS    module.o 	../kclib/log.o	../kclib/dump_data.o	../kclib/linux/slab.o 	../kclib/linux/atomic.o 	../kclib/linux/file.o	../kclib/linux/mem.o)set( QAX_KMOD_FLAGS	-I${
PUB_GENERATED_DIR} -I${
PUB_INC_DIR} -I${
INC_DIR})add_custom_target( build_core_mod ALL COMMAND ${
CMAKE_MAKE_PROGRAM} QAX_KMOD_NAME=${
QAX_KMOD_NAME} QAX_KMOD_FLAGS="${QAX_KMOD_FLAGS}" QAX_KMOD_OBJS="${QAX_KMOD_OBJS}" rebuild WORKING_DIRECTORY ${
CMAKE_CURRENT_SOURCE_DIR})

inc/CMakeLists.txt

set( INC_DIR  ${
CMAKE_CURRENT_SOURCE_DIR} CACHE STRING INTERNAL )set( INC_DIRS ${
INC_DIR} ${
PUB_DIRS} CACHE STRING INTERNAL )

kclib/CMakeLists.txt

add_subdirectory(linux)set( KCLIB_FILES      ${
CMAKE_CURRENT_SOURCE_DIR}/fc_log.o ${
CMAKE_CURRENT_SOURCE_DIR}/fc_dump_data.o ${
CMAKE_CURRENT_SOURCE_DIR}/linux/fc_atomic.o CACHE string INTERNAL)

转载地址:http://bnjvb.baihongyu.com/

你可能感兴趣的文章
JAVA 注解反射 过滤修改对象值
查看>>
SVN Working Copy Locked 解决方法
查看>>
Java Spring Cloud Gateway 和Zull 对比
查看>>
Spring Cloud Gateway 微服务系统使用swagger-bootstrap-ui生成接口文档
查看>>
Mysql 单表联合更新
查看>>
Mybatis Plus 逻辑删除理论与实践
查看>>
Java Hutool 汉字转拼音码
查看>>
Java后端限制频繁请求、重复提交
查看>>
Java Request 获取请求method,请求param,请求body
查看>>
Mybatis plus 多数据源切换
查看>>
极速搭建一个FTP服务器
查看>>
Java Ftp 文件操作
查看>>
Windows 简单安装配置Redis
查看>>
Mybatis Plus 逆向生成实体类、实现类、控制层
查看>>
IDEA解除SVN关联
查看>>
Springboot 指定运行时配置文件的几种方式
查看>>
Log4j 输出完整的异常信息
查看>>
Spring Boot打包成执行jar后获取classpath下文件异常解决
查看>>
Springboot 同时支持Http和Https访问
查看>>
Java 简单的复习下JDBC 工具类
查看>>