【AFL(十二)】make文件管理
在开始正式大规模测试公开库之前,我意识到一个问题,对Linux很不熟悉,特别是很多命令都是一知半解,这样不行,所以接下来两篇分别对make文件管理和cmake做学习笔记,线充电,同时一边对libansilove和libffjpeg两个库进行fuzz
make介绍:
make简单来说就是工程管理,代码量上来之后,如果每次编译都要 gcc -o out main.c ok.h ok.c ....... 这样的话太麻烦了,所以需要快捷的方式来管理编译过程,就出现了make。
make实例:(github上一个图像库ffjpeg的makefile:https://github.com/rockcarry/ffjpeg/blob/master/src/Makefile)
# makefile for ffjpeg project # written by rockcarry CC = gcc AR = ar CCFLAGS = -Wall OBJS = \ color.o \ dct.o \ quant.o \ zigzag.o \ bitstr.o \ huffman.o \ bmp.o \ jfif.o LIB = libffjpeg.a PROG = ffjpeg all : $(LIB) $(PROG) $(LIB) : $(OBJS) $(AR) rcs $@ $(OBJS) %.o : %.c %.h stdefine.h $(CC) $(CCFLAGS) -o $@ $< -c $(PROG) : $(PROG).o $(LIB) $(CC) $(CCFLAGS) -o $@ $< $(LIB) clean : -rm -f *.o -rm -f *.a -rm -f *.exe -rm -f $(PROG) # rockcarry # 2020.2.22 # THE END
这里有几个基本的概念需要理解:
1.反斜杠(\)是换行符的意思;
2.环境变量可以直接赋值,比如 CC = gcc,设置的就是C语言编译的环境,这种赋值跟 shell 脚本很像,但也不一样,比如 shell 里面严格控制操作符两边的空格,而 makefile 没有限制要求;
3.#是注释符
4.语法规则:
目标:目标所依赖文件1 目标所依赖文件2 ......
相互的依赖是逆序的,比如说 a.out 需要 main.o 和 m.o:
a.out:main.o m.o gcc main.o m.o main.o:main.c gcc -c main.c m.o:m.c bank.h gcc -c m.c bank.h
5.clean是对应make clean之后的操作,跟shell脚本相同
在fuzz时候见到make管理库的情况处理:
主要有两方面的问题要做:
第一是编译所用的工具,应该从gcc改为afl-gcc或者afl-clang;
第二方面是cflags也应该改,为了之后检测内存方便,最好就改成asan的模式下;
所以上面那个例子最后应该改成这样的:
# makefile for ffjpeg project # written by rockcarry #CC=gcc CC=afl-gcc AR = ar CCFLAGS = -Wall -g -fsanitize=address -fno-omit-frame-pointer -O1 OBJS = \ color.o \ dct.o \ quant.o \ zigzag.o \ bitstr.o \ huffman.o \ bmp.o \ jfif.o LIB = libffjpeg.a PROG = ffjpeg all : $(LIB) $(PROG) $(LIB) : $(OBJS) $(AR) rcs $@ $(OBJS) %.o : %.c %.h stdefine.h $(CC) $(CCFLAGS) -o $@ $< -c $(PROG) : $(PROG).o $(LIB) $(CC) $(CCFLAGS) -o $@ $< $(LIB) clean : -rm -f *.o -rm -f *.a -rm -f *.exe -rm -f $(PROG) # rockcarry # 2020.2.22 # THE END
这时候再进行make命令,所编译的就是经过插桩的了,一部分插桩来自afl的工具(比如afl-as),另一部分来自ASan(Address Sanitizer)。