头文件「+ 宏」
- FuzzerBuiltins.h「包装函数和内置函数的宏定义」
- FuzzerBuiltinsMsvc.h「使用内部函数,而不是MSVC无法编译的内置函数的包装函数和宏」
- FuzzerCommand.h「表示要在子流程中运行的命令。它允许调用者管理命令行参数以及输出和错误流。」
- FuzzerCorpus.h「用于输入的语料库」
- FuzzerDataFlowTrace.h「数据流跟踪「估计是用来做覆盖率计算的」」
- FuzzerDefs.h「一些基础的类和结构体的定义」
- FuzzerDictionary.h「namespace fuzzer,词典」
- FuzzerExtFunctions.def「外部函数的罗列」
- FuzzerExtFunctions.h「外部函数的定义」
- FuzzerFlags.def「旗帜-不知道是什么」
- FuzzerFork.h「分叉「主进程分叉为子进程」-在独立的子进程中运行fuzzing-生成并协调独立的模糊处理过程」
- FuzzerIO.h「Fuzzer的IO工具-读写文件」
- FuzzerInterface.h「一般不用-定义libFuzzer和正在测试的库之间的接口」
- FuzzerInternal.h「模糊器内部-对Fuzzer类以及大多数函数的定义」
- FuzzerMerge.h「合并语料库」
- FuzzerMutate.h「变异方法-对一个测试用例进行变异」
- FuzzerOptions.h「命令行中选项的含义」
- FuzzerPlatform.h「通用平台宏定义」
- FuzzerRandom.h「随机-可能是用来随机选取种子的」
- FuzzerSHA1.h「SHA1-一种加密工具」
- FuzzerTracePC.h「追踪PCs」
- FuzzerUtil.h「杂项工具」
- FuzzerValueBitMap.h「位图-二进制存储数据」
C++文件
- FuzzerCrossOver.cpp「libfuzzer的变异环节:交叉两个测试输入「像遗传算法那样」」
- FuzzerDataFlowTrace.cpp「数据流跟踪「估计是用来做覆盖率计算的」」
- FuzzerDriver.cpp「模糊器运行器」
- FuzzerExtFunctionsDlsym.cpp「苹果平台上使用的外部函数」
- FuzzerExtFunctionsWeak.cpp「Linux平台上使用的外部函数」
- FuzzerExtFunctionsWindows.cpp「Windows平台上使用的外部函数」
- FuzzerExtraCounters.cpp「用户代码定义的额外覆盖率计数器」——与优化函数相关
- FuzzerExtraCountersDarwin.cpp「 由用户代码为Darwin定义的额外覆盖率计数器。」
- FuzzerExtraCountersWindows.cpp「 由用户代码为Windows定义的额外覆盖率计数器。」
- FuzzerFork.cpp「分叉「主进程分叉为子进程」-在独立的子进程中运行fuzzing-生成并协调独立的模糊处理过程」
- FuzzerIO.cpp「Fuzzer的IO工具-读写文件」
- FuzzerIOPosix.cpp「使用Posix API实现IO函数」
- FuzzerIOWindows.cpp「为Windows实现的IO函数」
- FuzzerLoop.cpp「模糊循环-Fuzzer主循环-「可能是一个完整的流程」」
- FuzzerMerge.cpp「合并语料库」
- FuzzerMutate.cpp「变异方法-对一个测试用例进行变异」
- FuzzerSHA1.cpp「SHA1-一种加密工具」
- FuzzerTracePC.cpp「追踪PCs」
- FuzzerUtil.cpp「杂项工具」
- FuzzerUtilDarwin.cpp「对Darwin的杂项工具」
- FuzzerUtilFuchsia.cpp「使用Fuchsia/Zircon api实现的杂项工具」
- FuzzerUtilLinux.cpp「对Linux的杂项工具」
- FuzzerUtilPosix.cpp「使用Posix api实现的杂项工具」
- FuzzerUtilWindows.cpp「对Windows的杂项工具」
- FuzzerInterceptors.cpp「拦截libc的某些功能来帮助fuzzing」
-FuzzerMain.cpp「Fuzzer的主入口函数」
extern “C”
extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数。
链接
链接的主要内容就是将各个模块之间相互引用的部分正确的衔接起来。它的工作就是把一些指令对其他符号地址的引用加以修正。链接过程主要包括了地址和空间分配、符号决议和重定向