1set(LIBFUZZER_SOURCES 2 FuzzerCrossOver.cpp 3 FuzzerDataFlowTrace.cpp 4 FuzzerDriver.cpp 5 FuzzerExtFunctionsDlsym.cpp 6 FuzzerExtFunctionsWeak.cpp 7 FuzzerExtFunctionsWindows.cpp 8 FuzzerExtraCounters.cpp 9 FuzzerFork.cpp 10 FuzzerIO.cpp 11 FuzzerIOPosix.cpp 12 FuzzerIOWindows.cpp 13 FuzzerLoop.cpp 14 FuzzerMerge.cpp 15 FuzzerMutate.cpp 16 FuzzerSHA1.cpp 17 FuzzerTracePC.cpp 18 FuzzerUtil.cpp 19 FuzzerUtilDarwin.cpp 20 FuzzerUtilFuchsia.cpp 21 FuzzerUtilLinux.cpp 22 FuzzerUtilPosix.cpp 23 FuzzerUtilWindows.cpp) 24 25set(LIBFUZZER_HEADERS 26 FuzzerBuiltins.h 27 FuzzerBuiltinsMsvc.h 28 FuzzerCommand.h 29 FuzzerCorpus.h 30 FuzzerDataFlowTrace.h 31 FuzzerDefs.h 32 FuzzerDictionary.h 33 FuzzerExtFunctions.def 34 FuzzerExtFunctions.h 35 FuzzerFlags.def 36 FuzzerFork.h 37 FuzzerIO.h 38 FuzzerInterface.h 39 FuzzerInternal.h 40 FuzzerMerge.h 41 FuzzerMutate.h 42 FuzzerOptions.h 43 FuzzerRandom.h 44 FuzzerSHA1.h 45 FuzzerTracePC.h 46 FuzzerUtil.h 47 FuzzerValueBitMap.h) 48 49include_directories(../../include) 50 51CHECK_CXX_SOURCE_COMPILES(" 52 static thread_local int blah; 53 int main() { 54 return 0; 55 } 56 " HAS_THREAD_LOCAL) 57 58set(LIBFUZZER_CFLAGS ${COMPILER_RT_COMMON_CFLAGS}) 59 60if(OS_NAME MATCHES "Linux|Fuchsia" AND 61 COMPILER_RT_LIBCXX_PATH AND 62 COMPILER_RT_LIBCXXABI_PATH) 63 list(APPEND LIBFUZZER_CFLAGS -D_LIBCPP_ABI_VERSION=Fuzzer) 64 append_list_if(COMPILER_RT_HAS_NOSTDINCXX_FLAG -nostdinc++ LIBFUZZER_CFLAGS) 65elseif(TARGET cxx-headers OR HAVE_LIBCXX) 66 # libFuzzer uses C++ standard library headers. 67 set(LIBFUZZER_DEPS cxx-headers) 68endif() 69 70append_list_if(COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG -fno-omit-frame-pointer LIBFUZZER_CFLAGS) 71 72if (CMAKE_CXX_FLAGS MATCHES "fsanitize-coverage") 73 list(APPEND LIBFUZZER_CFLAGS -fno-sanitize-coverage=trace-pc-guard,edge,trace-cmp,indirect-calls,8bit-counters) 74endif() 75 76if(MSVC) 77 # Silence warnings by turning off exceptions in MSVC headers and avoid an 78 # error by unecessarily defining thread_local when it isn't even used on 79 # Windows. 80 list(APPEND LIBFUZZER_CFLAGS -D_HAS_EXCEPTIONS=0) 81else() 82 if(NOT HAS_THREAD_LOCAL) 83 list(APPEND LIBFUZZER_CFLAGS -Dthread_local=__thread) 84 endif() 85endif() 86 87add_compiler_rt_component(fuzzer) 88 89add_compiler_rt_object_libraries(RTfuzzer 90 OS ${FUZZER_SUPPORTED_OS} 91 ARCHS ${FUZZER_SUPPORTED_ARCH} 92 SOURCES ${LIBFUZZER_SOURCES} 93 ADDITIONAL_HEADERS ${LIBFUZZER_HEADERS} 94 CFLAGS ${LIBFUZZER_CFLAGS} 95 DEPS ${LIBFUZZER_DEPS}) 96 97add_compiler_rt_object_libraries(RTfuzzer_main 98 OS ${FUZZER_SUPPORTED_OS} 99 ARCHS ${FUZZER_SUPPORTED_ARCH} 100 SOURCES FuzzerMain.cpp 101 CFLAGS ${LIBFUZZER_CFLAGS} 102 DEPS ${LIBFUZZER_DEPS}) 103 104add_compiler_rt_object_libraries(RTfuzzer_interceptors 105 OS ${FUZZER_SUPPORTED_OS} 106 ARCHS ${FUZZER_SUPPORTED_ARCH} 107 SOURCES FuzzerInterceptors.cpp 108 CFLAGS ${LIBFUZZER_CFLAGS} 109 DEPS ${LIBFUZZER_DEPS}) 110 111add_compiler_rt_runtime(clang_rt.fuzzer 112 STATIC 113 OS ${FUZZER_SUPPORTED_OS} 114 ARCHS ${FUZZER_SUPPORTED_ARCH} 115 OBJECT_LIBS RTfuzzer RTfuzzer_main 116 CFLAGS ${LIBFUZZER_CFLAGS} 117 PARENT_TARGET fuzzer) 118 119add_compiler_rt_runtime(clang_rt.fuzzer_no_main 120 STATIC 121 OS ${FUZZER_SUPPORTED_OS} 122 ARCHS ${FUZZER_SUPPORTED_ARCH} 123 OBJECT_LIBS RTfuzzer 124 CFLAGS ${LIBFUZZER_CFLAGS} 125 PARENT_TARGET fuzzer) 126 127add_compiler_rt_runtime(clang_rt.fuzzer_interceptors 128 STATIC 129 OS ${FUZZER_SUPPORTED_OS} 130 ARCHS ${FUZZER_SUPPORTED_ARCH} 131 OBJECT_LIBS RTfuzzer_interceptors 132 CFLAGS ${LIBFUZZER_CFLAGS} 133 PARENT_TARGET fuzzer) 134 135if(OS_NAME MATCHES "Linux|Fuchsia" AND 136 COMPILER_RT_LIBCXX_PATH AND 137 COMPILER_RT_LIBCXXABI_PATH) 138 macro(partially_link_libcxx name dir arch) 139 if(${arch} MATCHES "i386") 140 set(EMULATION_ARGUMENT "-m" "elf_i386") 141 else() 142 set(EMULATION_ARGUMENT "") 143 endif() 144 set(cxx_${arch}_merge_dir "${CMAKE_CURRENT_BINARY_DIR}/cxx_${arch}_merge.dir") 145 file(MAKE_DIRECTORY ${cxx_${arch}_merge_dir}) 146 add_custom_command(TARGET clang_rt.${name}-${arch} POST_BUILD 147 COMMAND ${CMAKE_LINKER} ${EMULATION_ARGUMENT} --whole-archive "$<TARGET_LINKER_FILE:clang_rt.${name}-${arch}>" --no-whole-archive ${dir}/lib/libc++.a -r -o ${name}.o 148 COMMAND ${CMAKE_OBJCOPY} --localize-hidden ${name}.o 149 COMMAND ${CMAKE_COMMAND} -E remove "$<TARGET_LINKER_FILE:clang_rt.${name}-${arch}>" 150 COMMAND ${CMAKE_AR} qcs "$<TARGET_LINKER_FILE:clang_rt.${name}-${arch}>" ${name}.o 151 WORKING_DIRECTORY ${cxx_${arch}_merge_dir} 152 ) 153 endmacro() 154 155 foreach(arch ${FUZZER_SUPPORTED_ARCH}) 156 get_target_flags_for_arch(${arch} TARGET_CFLAGS) 157 set(LIBCXX_${arch}_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/libcxx_fuzzer_${arch}) 158 add_custom_libcxx(libcxx_fuzzer_${arch} ${LIBCXX_${arch}_PREFIX} 159 CFLAGS ${TARGET_CFLAGS} 160 CMAKE_ARGS -DCMAKE_CXX_COMPILER_WORKS=ON 161 -DCMAKE_POSITION_INDEPENDENT_CODE=ON 162 -DLIBCXXABI_ENABLE_EXCEPTIONS=OFF 163 -DLIBCXX_ABI_NAMESPACE=__Fuzzer) 164 target_compile_options(RTfuzzer.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1) 165 add_dependencies(RTfuzzer.${arch} libcxx_fuzzer_${arch}-build) 166 target_compile_options(RTfuzzer_main.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1) 167 add_dependencies(RTfuzzer_main.${arch} libcxx_fuzzer_${arch}-build) 168 target_compile_options(RTfuzzer_interceptors.${arch} PRIVATE -isystem ${LIBCXX_${arch}_PREFIX}/include/c++/v1) 169 add_dependencies(RTfuzzer_interceptors.${arch} libcxx_fuzzer_${arch}-build) 170 partially_link_libcxx(fuzzer_no_main ${LIBCXX_${arch}_PREFIX} ${arch}) 171 partially_link_libcxx(fuzzer_interceptors ${LIBCXX_${arch}_PREFIX} ${arch}) 172 partially_link_libcxx(fuzzer ${LIBCXX_${arch}_PREFIX} ${arch}) 173 endforeach() 174endif() 175 176if(COMPILER_RT_INCLUDE_TESTS) 177 add_subdirectory(tests) 178endif() 179