【AFL(十二)】make文件管理


在开始正式大规模测试公开库之前,我意识到一个问题,对Linux很不熟悉,特别是很多命令都是一知半解,这样不行,所以接下来两篇分别对make文件管理和cmake做学习笔记,线充电,同时一边对libansilovelibffjpeg两个库进行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)。

相关