zoukankan      html  css  js  c++  java
  • 【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)。

  • 相关阅读:
    Symmetric Tree
    Splunk的安装与使用
    【BZOJ2662】【BeiJing wc2012】冻结 分层图 裸的!
    Android NFC近场通信03----读写MifareClassic卡
    IOS把图片做成圆形效果
    【翻译自mos文章】CRS显示 正在执行的db instance 是offline状态
    远程訪问路由器下的mac os(ssh+vnc)
    POJ 2488 A Knight&#39;s Journey
    python 分词计算文档TF-IDF值并排序
    ExcelReader(解析Excel的工具类)
  • 原文地址:https://www.cnblogs.com/wayne-tao/p/13177296.html
Copyright © 2011-2022 走看看